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);
22 //****************************************************************
23 VTKViewer_UnScaledActor::VTKViewer_UnScaledActor() {}
25 //****************************************************************
26 void VTKViewer_UnScaledActor::Render(vtkRenderer *theRenderer)
29 float P[2][3] = {{-1.0, -1.0, 0.0},{+1.0, +1.0, 0.0}};
30 theRenderer->ViewToWorld(P[0][0],P[0][1],P[0][2]);
31 theRenderer->ViewToWorld(P[1][0],P[1][1],P[1][2]);
32 float aWorldDiag = sqrt((P[1][0]-P[0][0])*(P[1][0]-P[0][0])+
33 (P[1][1]-P[0][1])*(P[1][1]-P[0][1])+
34 (P[1][2]-P[0][2])*(P[1][2]-P[0][2]));
35 int* aSize = theRenderer->GetRenderWindow()->GetSize();
36 float aWinDiag = sqrt(float(aSize[0]*aSize[0]+aSize[1]*aSize[1]));
37 vtkDataSet* aDataSet = GetMapper()->GetInput();
38 float aLength = aDataSet->GetLength();
39 float aPrecision = 1.0E-3;
40 float anOldScale = GetScale()[0];
41 float aScale = mySize*aWorldDiag/aWinDiag/aLength*sqrt(float(aSize[0])/float(aSize[1]));
42 if(fabs(aScale - anOldScale)/aScale > aPrecision){
46 vtkFollower::Render(theRenderer);
49 //****************************************************************
50 void VTKViewer_UnScaledActor::SetSize(int theSize){
54 vtkStandardNewMacro(VTKViewer_LineActor);
56 vtkCxxSetObjectMacro(VTKViewer_LineActor,LabelActor,VTKViewer_UnScaledActor);
57 vtkCxxSetObjectMacro(VTKViewer_LineActor,ArrowActor,VTKViewer_UnScaledActor);
59 //****************************************************************
60 void VTKViewer_LineActor::Render(vtkRenderer *theRenderer)
62 if(LabelActor && LabelActor->GetVisibility()){
63 LabelActor->Modified();
64 LabelActor->Render(theRenderer);
66 if(ArrowActor && ArrowActor->GetVisibility()){
67 ArrowActor->Modified();
68 ArrowActor->Render(theRenderer);
70 vtkFollower::Render(theRenderer);
73 //****************************************************************
74 VTKViewer_Axis::VTKViewer_Axis()
76 // Initialize the Line pipe-line representation
77 myLineSource = vtkLineSource::New();
78 myLineSource->SetPoint1(0.0,0.0,0.0);
80 myMapper[0] = vtkPolyDataMapper::New();
81 myMapper[0]->SetInput(myLineSource->GetOutput());
83 myLineActor = VTKViewer_LineActor::New();
84 myLineActor->SetMapper(myMapper[0]);
85 myLineActor->PickableOff();
87 // Initialize the Arrow pipe-line representation
88 myConeSource = vtkConeSource::New();
89 myConeSource->SetResolution(2);
90 myConeSource->SetAngle(10);
92 myMapper[1] = vtkPolyDataMapper::New();
93 myMapper[1]->SetInput(myConeSource->GetOutput());
95 myArrowActor = VTKViewer_UnScaledActor::New();
96 myArrowActor->SetMapper(myMapper[1]);
97 static int aArrowActorSize = 24;
98 myArrowActor->SetSize(aArrowActorSize);
99 myArrowActor->PickableOff();
101 myLineActor->SetArrowActor(myArrowActor);
103 // Initialize the Label pipe-line representation
104 myVectorText = VTKViewer_VectorText::New();
106 myMapper[2] = vtkPolyDataMapper::New();
107 myMapper[2]->SetInput(myVectorText->GetOutput());
109 myLabelActor = VTKViewer_UnScaledActor::New();
110 myLabelActor->SetMapper(myMapper[2]);
111 static int aLabelActorSize = 12;
112 myLabelActor->SetSize(aLabelActorSize);
113 myLabelActor->PickableOff();
114 //myLabelActor->DebugOn();
116 myLineActor->SetLabelActor(myLabelActor);
118 // Initialise visibility param.
119 myVisibility = VTKViewer_Trihedron::eOn;
122 //****************************************************************
123 VTKViewer_Axis::~VTKViewer_Axis()
125 // Destroy of the Label pipe-line representation
126 myLabelActor->Delete();
128 myMapper[2]->RemoveAllInputs();
129 myMapper[2]->Delete();
131 myVectorText->Delete();
133 // Destroy of the Arrow pipe-line representation
134 myArrowActor->Delete();
136 myMapper[1]->RemoveAllInputs();
137 myMapper[1]->Delete();
139 myConeSource->Delete();
141 // Destroy of the Arrow pipe-line representation
142 myLineActor->Delete();
144 myMapper[2]->RemoveAllInputs();
145 myMapper[2]->Delete();
147 myLineSource->Delete();
150 //****************************************************************
151 void VTKViewer_Axis::AddToRender(vtkRenderer* theRenderer){
152 //Order of the calls are important
153 theRenderer->AddActor(myLineActor);
154 theRenderer->AddActor(myLabelActor);
155 theRenderer->AddActor(myArrowActor);
158 //****************************************************************
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 //****************************************************************
185 void VTKViewer_Axis::SetProperty(vtkProperty* theProperty){
186 myLabelActor->SetProperty(theProperty);
187 myArrowActor->SetProperty(theProperty);
188 myLineActor->SetProperty(theProperty);
191 //****************************************************************
192 void VTKViewer_Axis::SetSize(float theSize)
194 float aPosition[3] = {myDir[0]*theSize, myDir[1]*theSize, myDir[2]*theSize};
195 myLineSource->SetPoint2(aPosition);
197 myArrowActor->SetPosition(0.0,0.0,0.0);
198 myArrowActor->AddPosition(aPosition);
199 myArrowActor->SetOrientation(myRot);
201 myLabelActor->SetPosition(0.0,0.0,0.0);
202 myLabelActor->AddPosition(aPosition);
205 //****************************************************************
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 VTKViewer_XAxis::VTKViewer_XAxis(){
219 myDir[0] = 1.0; myDir[1] = 0.0; myDir[2] = 0.0;
220 myRot[0] = 0.0; myRot[1] = 0.0; myRot[2] = 0.0;
221 myVectorText->SetText("X");
222 vtkProperty* aProperty = vtkProperty::New();
223 aProperty->SetColor(1.0,0.0,0.0);
224 SetProperty(aProperty);
228 //==============================================================================
229 class VTKViewer_YAxis : public VTKViewer_Axis{
232 VTKViewer_YAxis(const VTKViewer_YAxis&);
234 vtkTypeMacro(VTKViewer_YAxis,VTKViewer_Axis);
235 static VTKViewer_YAxis *New();
238 vtkStandardNewMacro(VTKViewer_YAxis);
240 //****************************************************************
241 VTKViewer_YAxis::VTKViewer_YAxis()
243 myDir[0] = 0.0; myDir[1] = 1.0; myDir[2] = 0.0;
244 myRot[0] = 0.0; myRot[1] = 0.0; myRot[2] = 90.;
245 myVectorText->SetText("Y");
246 vtkProperty* aProperty = vtkProperty::New();
247 aProperty->SetColor(0.0,1.0,0.0);
248 SetProperty(aProperty);
252 //****************************************************************
253 class VTKViewer_ZAxis : public VTKViewer_Axis
257 VTKViewer_ZAxis(const VTKViewer_ZAxis&);
259 vtkTypeMacro(VTKViewer_ZAxis,VTKViewer_Axis);
260 static VTKViewer_ZAxis *New();
263 vtkStandardNewMacro(VTKViewer_ZAxis);
265 //****************************************************************
266 VTKViewer_ZAxis::VTKViewer_ZAxis()
268 myDir[0] = 0.0; myDir[1] = 0.0; myDir[2] = 1.0;
269 myRot[0] = 0.0; myRot[1] = -90; myRot[2] = 0.0;
270 myVectorText->SetText("Z");
271 vtkProperty* aProperty = vtkProperty::New();
272 aProperty->SetColor(0.0,0.0,1.0);
273 SetProperty(aProperty);
277 vtkStandardNewMacro(VTKViewer_Trihedron);
279 //****************************************************************
280 VTKViewer_Trihedron::VTKViewer_Trihedron()
282 myPresent = vtkActorCollection::New();
283 myAxis[0] = VTKViewer_XAxis::New();
284 myAxis[1] = VTKViewer_YAxis::New();
285 myAxis[2] = VTKViewer_ZAxis::New();
286 static float aSize = 100;
290 //****************************************************************
291 VTKViewer_Trihedron::~VTKViewer_Trihedron()
293 myPresent->RemoveAllItems();
295 for(int i = 0; i < 3; i++)
299 //****************************************************************
300 void VTKViewer_Trihedron::SetSize(float theSize)
303 for(int i = 0; i < 3; i++)
304 myAxis[i]->SetSize(theSize);
307 //****************************************************************
308 void VTKViewer_Trihedron::SetVisibility(TVisibility theVis)
310 for(int i = 0; i < 3; i++)
311 myAxis[i]->SetVisibility(theVis);
314 //****************************************************************
315 VTKViewer_Trihedron::TVisibility VTKViewer_Trihedron::GetVisibility()
317 return myAxis[0]->GetVisibility();
320 //****************************************************************
321 void VTKViewer_Trihedron::AddToRender(vtkRenderer* theRenderer)
323 vtkCamera* aCamera = theRenderer->GetActiveCamera();
324 for(int i = 0; i < 3; i++){
325 myAxis[i]->AddToRender(theRenderer);
326 myAxis[i]->SetCamera(aCamera);
330 //****************************************************************
331 void VTKViewer_Trihedron::RemoveFromRender(vtkRenderer* theRenderer)
333 myPresent->InitTraversal();
334 while(vtkActor* anActor = myPresent->GetNextActor())
335 theRenderer->RemoveActor(anActor);
338 //****************************************************************
339 int VTKViewer_Trihedron::GetVisibleActorCount(vtkRenderer* theRenderer)
341 //TVisibility aVis = GetVisibility();
342 //SetVisibility(eOff);
343 vtkActorCollection* aCollection = theRenderer->GetActors();
344 aCollection->InitTraversal();
346 while(vtkActor* prop = aCollection->GetNextActor()) {
347 if( prop->GetVisibility())
348 if(VTKViewer_Actor* anActor = VTKViewer_Actor::SafeDownCast(prop))
349 if(!anActor->IsInfinitive())
351 //int aCount = theRenderer->VisibleActorCount();
352 //SetVisibility(aVis);