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() {/*!Do nothing*/}
25 /*!This causes the actor to be rendered.
26 * Set new scale for actor.
28 void VTKViewer_UnScaledActor::Render(vtkRenderer *theRenderer)
31 float P[2][3] = {{-1.0, -1.0, 0.0},{+1.0, +1.0, 0.0}};
32 theRenderer->ViewToWorld(P[0][0],P[0][1],P[0][2]);
33 theRenderer->ViewToWorld(P[1][0],P[1][1],P[1][2]);
34 float aWorldDiag = sqrt((P[1][0]-P[0][0])*(P[1][0]-P[0][0])+
35 (P[1][1]-P[0][1])*(P[1][1]-P[0][1])+
36 (P[1][2]-P[0][2])*(P[1][2]-P[0][2]));
37 int* aSize = theRenderer->GetRenderWindow()->GetSize();
38 float aWinDiag = sqrt(float(aSize[0]*aSize[0]+aSize[1]*aSize[1]));
39 vtkDataSet* aDataSet = GetMapper()->GetInput();
40 float aLength = aDataSet->GetLength();
41 float aPrecision = 1.0E-3;
42 float anOldScale = GetScale()[0];
43 float aScale = mySize*aWorldDiag/aWinDiag/aLength*sqrt(float(aSize[0])/float(aSize[1]));
44 if(fabs(aScale - anOldScale)/aScale > aPrecision){
48 vtkFollower::Render(theRenderer);
51 /*! Sets \a mySize= \a theSize variable.
52 * \param theSize - integer size
54 void VTKViewer_UnScaledActor::SetSize(int theSize){
58 vtkStandardNewMacro(VTKViewer_LineActor);
60 vtkCxxSetObjectMacro(VTKViewer_LineActor,LabelActor,VTKViewer_UnScaledActor);
61 vtkCxxSetObjectMacro(VTKViewer_LineActor,ArrowActor,VTKViewer_UnScaledActor);
63 /*!Adds Label and Arrow actors to \a theRenderer.*/
64 void VTKViewer_LineActor::Render(vtkRenderer *theRenderer)
66 if(LabelActor && LabelActor->GetVisibility()){
67 LabelActor->Modified();
68 LabelActor->Render(theRenderer);
70 if(ArrowActor && ArrowActor->GetVisibility()){
71 ArrowActor->Modified();
72 ArrowActor->Render(theRenderer);
74 vtkFollower::Render(theRenderer);
77 VTKViewer_Axis::VTKViewer_Axis()
79 /*! \li Initialize the Line pipe-line representation*/
80 myLineSource = vtkLineSource::New();
81 myLineSource->SetPoint1(0.0,0.0,0.0);
83 myMapper[0] = vtkPolyDataMapper::New();
84 myMapper[0]->SetInput(myLineSource->GetOutput());
86 myLineActor = VTKViewer_LineActor::New();
87 myLineActor->SetMapper(myMapper[0]);
88 myLineActor->PickableOff();
90 /*! \li Initialize the Arrow pipe-line representation*/
91 myConeSource = vtkConeSource::New();
92 myConeSource->SetResolution(2);
93 myConeSource->SetAngle(10);
95 myMapper[1] = vtkPolyDataMapper::New();
96 myMapper[1]->SetInput(myConeSource->GetOutput());
98 myArrowActor = VTKViewer_UnScaledActor::New();
99 myArrowActor->SetMapper(myMapper[1]);
100 static int aArrowActorSize = 24;
101 myArrowActor->SetSize(aArrowActorSize);
102 myArrowActor->PickableOff();
104 myLineActor->SetArrowActor(myArrowActor);
106 /*! \li Initialize the Label pipe-line representation */
107 myVectorText = VTKViewer_VectorText::New();
109 myMapper[2] = vtkPolyDataMapper::New();
110 myMapper[2]->SetInput(myVectorText->GetOutput());
112 myLabelActor = VTKViewer_UnScaledActor::New();
113 myLabelActor->SetMapper(myMapper[2]);
114 static int aLabelActorSize = 12;
115 myLabelActor->SetSize(aLabelActorSize);
116 myLabelActor->PickableOff();
117 //myLabelActor->DebugOn();
119 myLineActor->SetLabelActor(myLabelActor);
121 /*! \li Initialise visibility param.*/
122 myVisibility = VTKViewer_Trihedron::eOn;
125 VTKViewer_Axis::~VTKViewer_Axis()
127 /*! \li Destroy of the Label pipe-line representation */
128 myLabelActor->Delete();
130 myMapper[2]->RemoveAllInputs();
131 myMapper[2]->Delete();
133 myVectorText->Delete();
135 /*! \li Destroy of the Arrow pipe-line representation */
136 myArrowActor->Delete();
138 myMapper[1]->RemoveAllInputs();
139 myMapper[1]->Delete();
141 myConeSource->Delete();
143 /*! \li Destroy of the Line pipe-line representation */
144 myLineActor->Delete();
146 myMapper[2]->RemoveAllInputs();
147 myMapper[2]->Delete();
149 myLineSource->Delete();
152 void VTKViewer_Axis::AddToRender(vtkRenderer* theRenderer){
153 /*! \li Order of the calls are important*/
154 theRenderer->AddActor(myLineActor);
155 theRenderer->AddActor(myLabelActor);
156 theRenderer->AddActor(myArrowActor);
159 void VTKViewer_Axis::SetVisibility(VTKViewer_Trihedron::TVisibility theVis)
162 case VTKViewer_Trihedron::eOff:
163 case VTKViewer_Trihedron::eOn:
164 myLabelActor->SetVisibility(theVis);
165 myArrowActor->SetVisibility(theVis);
166 myLineActor->SetVisibility(theVis);
168 case VTKViewer_Trihedron::eOnlyLineOn:
169 myLabelActor->VisibilityOff();
170 myArrowActor->VisibilityOff();
171 myLineActor->VisibilityOn();
176 myVisibility = theVis;
179 //****************************************************************
180 void VTKViewer_Axis::SetCamera(vtkCamera* theCamera){
181 myLabelActor->SetCamera(theCamera);
184 void VTKViewer_Axis::SetProperty(vtkProperty* theProperty){
185 myLabelActor->SetProperty(theProperty);
186 myArrowActor->SetProperty(theProperty);
187 myLineActor->SetProperty(theProperty);
190 void VTKViewer_Axis::SetSize(float theSize)
192 float aPosition[3] = {myDir[0]*theSize, myDir[1]*theSize, myDir[2]*theSize};
193 myLineSource->SetPoint2(aPosition);
195 myArrowActor->SetPosition(0.0,0.0,0.0);
196 myArrowActor->AddPosition(aPosition);
197 myArrowActor->SetOrientation(myRot);
199 myLabelActor->SetPosition(0.0,0.0,0.0);
200 myLabelActor->AddPosition(aPosition);
203 /*! \class VTKViewer_XAxis
204 * \brief X Axis actor
206 class VTKViewer_XAxis : public VTKViewer_Axis
210 VTKViewer_XAxis(const VTKViewer_XAxis&);
212 vtkTypeMacro(VTKViewer_XAxis,VTKViewer_Axis);
213 static VTKViewer_XAxis *New();
216 vtkStandardNewMacro(VTKViewer_XAxis);
218 /*!Initialize X Axis*/
219 VTKViewer_XAxis::VTKViewer_XAxis(){
220 myDir[0] = 1.0; myDir[1] = 0.0; myDir[2] = 0.0;
221 myRot[0] = 0.0; myRot[1] = 0.0; myRot[2] = 0.0;
222 myVectorText->SetText("X");
223 vtkProperty* aProperty = vtkProperty::New();
224 aProperty->SetColor(1.0,0.0,0.0);
225 SetProperty(aProperty);
229 /*! \class VTKViewer_YAxis
230 * \brief Y Axis actor
232 class VTKViewer_YAxis : public VTKViewer_Axis{
235 VTKViewer_YAxis(const VTKViewer_YAxis&);
237 vtkTypeMacro(VTKViewer_YAxis,VTKViewer_Axis);
238 static VTKViewer_YAxis *New();
241 vtkStandardNewMacro(VTKViewer_YAxis);
243 /*!Initialize Y Axis*/
244 VTKViewer_YAxis::VTKViewer_YAxis()
246 myDir[0] = 0.0; myDir[1] = 1.0; myDir[2] = 0.0;
247 myRot[0] = 0.0; myRot[1] = 0.0; myRot[2] = 90.;
248 myVectorText->SetText("Y");
249 vtkProperty* aProperty = vtkProperty::New();
250 aProperty->SetColor(0.0,1.0,0.0);
251 SetProperty(aProperty);
255 /*! \class VTKViewer_ZAxis
256 * \brief Z Axis actor
258 class VTKViewer_ZAxis : public VTKViewer_Axis
262 VTKViewer_ZAxis(const VTKViewer_ZAxis&);
264 vtkTypeMacro(VTKViewer_ZAxis,VTKViewer_Axis);
265 static VTKViewer_ZAxis *New();
268 vtkStandardNewMacro(VTKViewer_ZAxis);
270 /*!Initialize Z Axis*/
271 VTKViewer_ZAxis::VTKViewer_ZAxis()
273 myDir[0] = 0.0; myDir[1] = 0.0; myDir[2] = 1.0;
274 myRot[0] = 0.0; myRot[1] = -90; myRot[2] = 0.0;
275 myVectorText->SetText("Z");
276 vtkProperty* aProperty = vtkProperty::New();
277 aProperty->SetColor(0.0,0.0,1.0);
278 SetProperty(aProperty);
282 vtkStandardNewMacro(VTKViewer_Trihedron);
284 VTKViewer_Trihedron::VTKViewer_Trihedron()
286 myPresent = vtkActorCollection::New();
287 myAxis[0] = VTKViewer_XAxis::New();
288 myAxis[1] = VTKViewer_YAxis::New();
289 myAxis[2] = VTKViewer_ZAxis::New();
290 static float aSize = 100;
294 VTKViewer_Trihedron::~VTKViewer_Trihedron()
296 myPresent->RemoveAllItems();
298 for(int i = 0; i < 3; i++)
302 void VTKViewer_Trihedron::SetSize(float theSize)
305 for(int i = 0; i < 3; i++)
306 myAxis[i]->SetSize(theSize);
309 void VTKViewer_Trihedron::SetVisibility(TVisibility theVis)
311 for(int i = 0; i < 3; i++)
312 myAxis[i]->SetVisibility(theVis);
315 VTKViewer_Trihedron::TVisibility VTKViewer_Trihedron::GetVisibility()
317 return myAxis[0]->GetVisibility();
320 void VTKViewer_Trihedron::AddToRender(vtkRenderer* theRenderer)
322 vtkCamera* aCamera = theRenderer->GetActiveCamera();
323 for(int i = 0; i < 3; i++){
324 myAxis[i]->AddToRender(theRenderer);
325 myAxis[i]->SetCamera(aCamera);
329 void VTKViewer_Trihedron::RemoveFromRender(vtkRenderer* theRenderer)
331 myPresent->InitTraversal();
332 while(vtkActor* anActor = myPresent->GetNextActor())
333 theRenderer->RemoveActor(anActor);
336 int VTKViewer_Trihedron::GetVisibleActorCount(vtkRenderer* theRenderer)
338 //TVisibility aVis = GetVisibility();
339 //SetVisibility(eOff);
340 vtkActorCollection* aCollection = theRenderer->GetActors();
341 aCollection->InitTraversal();
343 while(vtkActor* prop = aCollection->GetNextActor()) {
344 if( prop->GetVisibility())
345 if(VTKViewer_Actor* anActor = VTKViewer_Actor::SafeDownCast(prop))
346 if(!anActor->IsInfinitive())
348 //int aCount = theRenderer->VisibleActorCount();
349 //SetVisibility(aVis);