1 #include "VTKViewer_Trihedron.h"
2 #include "VTKViewer_Actor.h"
7 #include <vtkDataSet.h>
8 #include <vtkRenderer.h>
9 #include <vtkRenderWindow.h>
10 #include <vtkObjectFactory.h>
13 #include <vtkProperty.h>
14 #include <vtkLineSource.h>
15 #include <vtkConeSource.h>
16 #include <vtkPolyDataMapper.h>
18 #include "VTKViewer_VectorText.h"
20 vtkStandardNewMacro(VTKViewer_UnScaledActor);
23 VTKViewer_UnScaledActor::VTKViewer_UnScaledActor()
25 Bounds[0] = Bounds[2] = Bounds[4] = VTK_LARGE_FLOAT;
26 Bounds[1] = Bounds[3] = Bounds[5] = -VTK_LARGE_FLOAT;
30 VTKViewer_UnScaledActor
36 /*! Sets \a mySize= \a theSize variable.
37 * \param theSize - integer size
39 void VTKViewer_UnScaledActor::SetSize(int theSize)
44 /*!This causes the actor to be rendered.
45 * Set new scale for actor.
47 void VTKViewer_UnScaledActor::Render(vtkRenderer *theRenderer)
50 float P[2][3] = {{-1.0, -1.0, 0.0},{+1.0, +1.0, 0.0}};
51 theRenderer->ViewToWorld(P[0][0],P[0][1],P[0][2]);
52 theRenderer->ViewToWorld(P[1][0],P[1][1],P[1][2]);
53 float aWorldDiag = sqrt((P[1][0]-P[0][0])*(P[1][0]-P[0][0])+
54 (P[1][1]-P[0][1])*(P[1][1]-P[0][1])+
55 (P[1][2]-P[0][2])*(P[1][2]-P[0][2]));
56 int* aSize = theRenderer->GetRenderWindow()->GetSize();
57 float aWinDiag = sqrt(float(aSize[0]*aSize[0]+aSize[1]*aSize[1]));
58 vtkDataSet* aDataSet = GetMapper()->GetInput();
59 float aLength = aDataSet->GetLength();
60 float aPrecision = 1.0E-3;
61 float anOldScale = GetScale()[0];
62 float aScale = mySize*aWorldDiag/aWinDiag/aLength*sqrt(float(aSize[0])/float(aSize[1]));
63 if(fabs(aScale - anOldScale)/aScale > aPrecision){
67 vtkFollower::Render(theRenderer);
70 vtkStandardNewMacro(VTKViewer_LineActor);
72 vtkCxxSetObjectMacro(VTKViewer_LineActor,LabelActor,VTKViewer_UnScaledActor);
73 vtkCxxSetObjectMacro(VTKViewer_LineActor,ArrowActor,VTKViewer_UnScaledActor);
75 /*!Adds Label and Arrow actors to \a theRenderer.*/
76 void VTKViewer_LineActor::Render(vtkRenderer *theRenderer)
78 if(LabelActor && LabelActor->GetVisibility()){
79 LabelActor->Modified();
80 LabelActor->Render(theRenderer);
82 if(ArrowActor && ArrowActor->GetVisibility()){
83 ArrowActor->Modified();
84 ArrowActor->Render(theRenderer);
86 vtkFollower::Render(theRenderer);
89 VTKViewer_Axis::VTKViewer_Axis()
91 /*! \li Initialize the Line pipe-line representation*/
92 myLineSource = vtkLineSource::New();
93 myLineSource->SetPoint1(0.0,0.0,0.0);
95 myMapper[0] = vtkPolyDataMapper::New();
96 myMapper[0]->SetInput(myLineSource->GetOutput());
98 myLineActor = VTKViewer_LineActor::New();
99 myLineActor->SetMapper(myMapper[0]);
100 myLineActor->PickableOff();
102 /*! \li Initialize the Arrow pipe-line representation*/
103 myConeSource = vtkConeSource::New();
104 myConeSource->SetResolution(2);
105 myConeSource->SetAngle(10);
107 myMapper[1] = vtkPolyDataMapper::New();
108 myMapper[1]->SetInput(myConeSource->GetOutput());
110 myArrowActor = VTKViewer_UnScaledActor::New();
111 myArrowActor->SetMapper(myMapper[1]);
112 static int aArrowActorSize = 24;
113 myArrowActor->SetSize(aArrowActorSize);
114 myArrowActor->PickableOff();
116 myLineActor->SetArrowActor(myArrowActor);
118 /*! \li Initialize the Label pipe-line representation */
119 myVectorText = VTKViewer_VectorText::New();
121 myMapper[2] = vtkPolyDataMapper::New();
122 myMapper[2]->SetInput(myVectorText->GetOutput());
124 myLabelActor = VTKViewer_UnScaledActor::New();
125 myLabelActor->SetMapper(myMapper[2]);
126 static int aLabelActorSize = 12;
127 myLabelActor->SetSize(aLabelActorSize);
128 myLabelActor->PickableOff();
129 //myLabelActor->DebugOn();
131 myLineActor->SetLabelActor(myLabelActor);
133 /*! \li Initialise visibility param.*/
134 myVisibility = VTKViewer_Trihedron::eOn;
137 VTKViewer_Axis::~VTKViewer_Axis()
139 /*! \li Destroy of the Label pipe-line representation */
140 myLabelActor->Delete();
142 myMapper[0]->RemoveAllInputs();
143 myMapper[0]->Delete();
145 myVectorText->Delete();
147 /*! \li Destroy of the Arrow pipe-line representation */
148 myArrowActor->Delete();
150 myMapper[1]->RemoveAllInputs();
151 myMapper[1]->Delete();
153 myConeSource->Delete();
155 /*! \li Destroy of the Line pipe-line representation */
156 myLineActor->Delete();
158 myMapper[2]->RemoveAllInputs();
159 myMapper[2]->Delete();
161 myLineSource->Delete();
164 void VTKViewer_Axis::AddToRender(vtkRenderer* theRenderer){
165 /*! \li Order of the calls are important*/
166 theRenderer->AddActor(myLineActor);
167 theRenderer->AddActor(myLabelActor);
168 theRenderer->AddActor(myArrowActor);
171 void VTKViewer_Axis::RemoveFromRender(vtkRenderer* theRenderer){
172 /*! \li Order of the calls are important*/
173 theRenderer->RemoveActor(myLineActor);
174 theRenderer->RemoveActor(myLabelActor);
175 theRenderer->RemoveActor(myArrowActor);
178 void VTKViewer_Axis::SetVisibility(VTKViewer_Trihedron::TVisibility theVis)
181 case VTKViewer_Trihedron::eOff:
182 case VTKViewer_Trihedron::eOn:
183 myLabelActor->SetVisibility(theVis);
184 myArrowActor->SetVisibility(theVis);
185 myLineActor->SetVisibility(theVis);
187 case VTKViewer_Trihedron::eOnlyLineOn:
188 myLabelActor->VisibilityOff();
189 myArrowActor->VisibilityOff();
190 myLineActor->VisibilityOn();
195 myVisibility = theVis;
198 //****************************************************************
199 void VTKViewer_Axis::SetCamera(vtkCamera* theCamera){
200 myLabelActor->SetCamera(theCamera);
203 void VTKViewer_Axis::SetProperty(vtkProperty* theProperty){
204 myLabelActor->SetProperty(theProperty);
205 myArrowActor->SetProperty(theProperty);
206 myLineActor->SetProperty(theProperty);
209 void VTKViewer_Axis::SetSize(float theSize)
211 float aPosition[3] = {myDir[0]*theSize, myDir[1]*theSize, myDir[2]*theSize};
212 myLineSource->SetPoint2(aPosition);
214 myArrowActor->SetPosition(0.0,0.0,0.0);
215 myArrowActor->AddPosition(aPosition);
216 myArrowActor->SetOrientation(myRot);
218 myLabelActor->SetPosition(0.0,0.0,0.0);
219 myLabelActor->AddPosition(aPosition);
222 /*! \class VTKViewer_XAxis
223 * \brief X Axis actor
225 class VTKViewer_XAxis : public VTKViewer_Axis
229 VTKViewer_XAxis(const VTKViewer_XAxis&);
231 vtkTypeMacro(VTKViewer_XAxis,VTKViewer_Axis);
232 static VTKViewer_XAxis *New();
235 vtkStandardNewMacro(VTKViewer_XAxis);
237 /*!Initialize X Axis*/
238 VTKViewer_XAxis::VTKViewer_XAxis(){
239 myDir[0] = 1.0; myDir[1] = 0.0; myDir[2] = 0.0;
240 myRot[0] = 0.0; myRot[1] = 0.0; myRot[2] = 0.0;
241 myVectorText->SetText("X");
242 vtkProperty* aProperty = vtkProperty::New();
243 aProperty->SetColor(1.0,0.0,0.0);
244 SetProperty(aProperty);
248 /*! \class VTKViewer_YAxis
249 * \brief Y Axis actor
251 class VTKViewer_YAxis : public VTKViewer_Axis{
254 VTKViewer_YAxis(const VTKViewer_YAxis&);
256 vtkTypeMacro(VTKViewer_YAxis,VTKViewer_Axis);
257 static VTKViewer_YAxis *New();
260 vtkStandardNewMacro(VTKViewer_YAxis);
262 /*!Initialize Y Axis*/
263 VTKViewer_YAxis::VTKViewer_YAxis()
265 myDir[0] = 0.0; myDir[1] = 1.0; myDir[2] = 0.0;
266 myRot[0] = 0.0; myRot[1] = 0.0; myRot[2] = 90.;
267 myVectorText->SetText("Y");
268 vtkProperty* aProperty = vtkProperty::New();
269 aProperty->SetColor(0.0,1.0,0.0);
270 SetProperty(aProperty);
274 /*! \class VTKViewer_ZAxis
275 * \brief Z Axis actor
277 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 /*!Initialize Z Axis*/
290 VTKViewer_ZAxis::VTKViewer_ZAxis()
292 myDir[0] = 0.0; myDir[1] = 0.0; myDir[2] = 1.0;
293 myRot[0] = 0.0; myRot[1] = -90; myRot[2] = 0.0;
294 myVectorText->SetText("Z");
295 vtkProperty* aProperty = vtkProperty::New();
296 aProperty->SetColor(0.0,0.0,1.0);
297 SetProperty(aProperty);
301 vtkStandardNewMacro(VTKViewer_Trihedron);
303 VTKViewer_Trihedron::VTKViewer_Trihedron()
305 myPresent = vtkActorCollection::New();
306 myAxis[0] = VTKViewer_XAxis::New();
307 myAxis[1] = VTKViewer_YAxis::New();
308 myAxis[2] = VTKViewer_ZAxis::New();
309 static float aSize = 100;
313 VTKViewer_Trihedron::~VTKViewer_Trihedron()
315 myPresent->RemoveAllItems();
317 for(int i = 0; i < 3; i++)
321 void VTKViewer_Trihedron::SetSize(float theSize)
324 for(int i = 0; i < 3; i++)
325 myAxis[i]->SetSize(theSize);
328 void VTKViewer_Trihedron::SetVisibility(TVisibility theVis)
330 for(int i = 0; i < 3; i++)
331 myAxis[i]->SetVisibility(theVis);
334 VTKViewer_Trihedron::TVisibility VTKViewer_Trihedron::GetVisibility()
336 return myAxis[0]->GetVisibility();
339 void VTKViewer_Trihedron::AddToRender(vtkRenderer* theRenderer)
341 vtkCamera* aCamera = theRenderer->GetActiveCamera();
342 for(int i = 0; i < 3; i++){
343 myAxis[i]->AddToRender(theRenderer);
344 myAxis[i]->SetCamera(aCamera);
348 void VTKViewer_Trihedron::RemoveFromRender(vtkRenderer* theRenderer)
350 myPresent->InitTraversal();
351 while(vtkActor* anActor = myPresent->GetNextActor())
352 theRenderer->RemoveActor(anActor);
353 for(int i = 0; i < 3; i++)
354 myAxis[i]->RemoveFromRender(theRenderer);
357 int VTKViewer_Trihedron::GetVisibleActorCount(vtkRenderer* theRenderer)
359 //TVisibility aVis = GetVisibility();
360 //SetVisibility(eOff);
361 vtkActorCollection* aCollection = theRenderer->GetActors();
362 aCollection->InitTraversal();
364 while(vtkActor* prop = aCollection->GetNextActor()) {
365 if( prop->GetVisibility())
366 if(VTKViewer_Actor* anActor = VTKViewer_Actor::SafeDownCast(prop))
367 if(!anActor->IsInfinitive())
369 //int aCount = theRenderer->VisibleActorCount();
370 //SetVisibility(aVis);