]> SALOME platform Git repositories - modules/gui.git/blob - src/VTKViewer/VTKViewer_FramedTextActor.cxx
Salome HOME
3de2711f132fc6dafbcc4a588d52f31457de9589
[modules/gui.git] / src / VTKViewer / VTKViewer_FramedTextActor.cxx
1 // Copyright (C) 2007-2014  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
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, or (at your option) any later version.
7 //
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.
12 //
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
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19
20 #include "VTKViewer_FramedTextActor.h"
21
22 #include <vtkCellArray.h>
23 #include <vtkObjectFactory.h>
24 #include <vtkPoints.h>
25 #include <vtkPolyData.h>
26 #include <vtkPolyDataMapper2D.h>
27 #include <vtkProperty2D.h>
28 #include <vtkRenderer.h>
29 #include <vtkTextActor.h>
30 #include <vtkTextMapper.h>
31 #include <vtkTextProperty.h>
32 #include <vtkTimeStamp.h>
33 #include <vtkViewport.h>
34 #include <vtkWindow.h>
35
36 #include <QStringList>
37
38 #define TEXT_MARGIN    4
39 #define OFFSET_SPACING 2
40
41 //==================================================================
42 vtkStandardNewMacro(VTKViewer_FramedTextActor);
43
44 //==================================================================
45 // function : VTKViewer_FramedTextActor
46 // purpose  :
47 //==================================================================
48 VTKViewer_FramedTextActor::VTKViewer_FramedTextActor()
49 {
50   PositionCoordinate->SetCoordinateSystemToNormalizedViewport();
51
52   myTransparency=0.;
53   myBar = vtkPolyData::New();
54   myBarMapper = vtkPolyDataMapper2D::New();
55   myBarMapper->SetInputData(myBar);
56   myBarActor = vtkActor2D::New();
57   myBarActor->SetMapper(myBarMapper);
58   myBarActor->GetProperty()->SetOpacity(1.-myTransparency);  
59   myBarActor->GetProperty()->SetColor(.5, .5, .5); 
60
61   myTextProperty = vtkTextProperty::New();
62   myTextProperty->SetFontSize(12);
63   myTextProperty->SetBold(0);
64   myTextProperty->SetItalic(0);
65   myTextProperty->SetShadow(1);
66   myTextProperty->SetFontFamilyToArial();
67   
68   myTextActor=vtkTextActor::New();
69   myTextActor->SetTextProperty(myTextProperty);
70
71   myBarActor->SetVisibility(1);
72   myTextActor->SetVisibility(1);
73   myBarActor->SetPickable(0);
74   myTextActor->SetPickable(0);
75
76   myModePosition = BelowPoint;
77   myLayoutType = Vertical;
78
79   for(int i=0; i<4; i++) {
80     myWorldPoint[i] = 0.;
81   }
82   myDistance=10.;
83
84   myTextMargin = TEXT_MARGIN;
85
86   myHorizontalOffset = 0;
87   myVerticalOffset = 0;
88
89   myMoveFrameFlag = 0;
90 }
91
92 //==================================================================
93 // function : ~
94 // purpose  :
95 //==================================================================
96 VTKViewer_FramedTextActor::~VTKViewer_FramedTextActor()
97 {
98   myTextActor->Delete();
99   myTextProperty->Delete();
100   myBarActor->Delete();
101   myBarMapper->Delete();
102   myBar->Delete();
103 }
104
105 //==================================================================
106 // function : SetVisibility
107 // purpose  :
108 //==================================================================
109 void VTKViewer_FramedTextActor::SetVisibility (int theVisibility)
110 {
111   myBarActor->SetVisibility(theVisibility);
112   myTextActor->SetVisibility(theVisibility);
113 }
114
115 //==================================================================
116 // function : GetVisibility
117 // purpose  :
118 //==================================================================
119 int VTKViewer_FramedTextActor::GetVisibility() 
120 {
121   return myBarActor->GetVisibility();
122 }
123
124 //==================================================================
125 // function : SetPickable
126 // purpose  :
127 //==================================================================
128 void VTKViewer_FramedTextActor::SetPickable (int thePickability) 
129 {
130   myBarActor->SetPickable(thePickability);
131   myTextActor->SetPickable(thePickability);
132 }
133
134 //==================================================================
135 // function : GetPickable
136 // purpose  :
137 //==================================================================
138 int VTKViewer_FramedTextActor::GetPickable()
139 {
140   return myBarActor->GetPickable();
141 }
142
143 //==================================================================
144 // function : GetSize
145 // purpose  :
146 //==================================================================
147 void VTKViewer_FramedTextActor::GetSize(vtkRenderer* vport, double theSize[2]) const
148 {
149   myTextActor->GetSize(vport, theSize);
150   theSize[0] = theSize[0] + 2 * GetTextMargin() + OFFSET_SPACING;
151   theSize[1] = theSize[1] + 2 * GetTextMargin() + OFFSET_SPACING;
152 }
153
154 //==================================================================
155 // function : SetForegroundColor
156 // purpose  :
157 //==================================================================
158 void VTKViewer_FramedTextActor::SetForegroundColor(const double r,
159                                                    const double g,
160                                                    const double b)
161 {
162   myTextProperty->SetColor(r, g, b);
163   myTextActor->GetTextProperty()->ShallowCopy(myTextProperty);
164   Modified();
165 }
166
167 //==================================================================
168 // function : GetForegroundColor
169 // purpose  :
170 //==================================================================
171 void VTKViewer_FramedTextActor::GetForegroundColor(double& r,
172                                                    double& g,
173                                                    double& b)
174 {
175   double aColor[3];
176   myTextProperty->GetColor(aColor);
177   r = aColor[0];
178   g = aColor[1];
179   b = aColor[2];
180 }
181
182 //==================================================================
183 // function : SetBackgroundColor
184 // purpose  :
185 //==================================================================
186 void VTKViewer_FramedTextActor::SetBackgroundColor(const double r,
187                                                    const double g,
188                                                    const double b)
189 {
190   myBarActor->GetProperty()->SetColor(r, g, b);
191   Modified();
192 }
193
194 //==================================================================
195 // function : GetBackgroundColor
196 // purpose  :
197 //==================================================================
198 void VTKViewer_FramedTextActor::GetBackgroundColor(double& r,
199                                                    double& g,
200                                                    double& b)
201 {
202   double aColor[3];
203   myBarActor->GetProperty()->GetColor(aColor);
204   r = aColor[0];
205   g = aColor[1];
206   b = aColor[2];
207 }
208
209 //==================================================================
210 // function : SetTransparency
211 // purpose  :
212 //==================================================================
213 void VTKViewer_FramedTextActor::SetTransparency(const double theTransparency)
214 {
215   if (theTransparency>=0.  && theTransparency<=1.){
216     myTransparency=theTransparency;
217     myBarActor->GetProperty()->SetOpacity(1.-myTransparency);  
218     Modified();
219   }
220 }
221
222 //==================================================================
223 // function : GetTransparency
224 // purpose  :
225 //==================================================================
226 double VTKViewer_FramedTextActor::GetTransparency()const
227 {
228   return myTransparency;
229 }
230
231 //==================================================================
232 // function : SetTextMargin
233 // purpose  :
234 //==================================================================
235 void VTKViewer_FramedTextActor::SetTextMargin(const int theMargin)
236 {
237   if( theMargin >= 0 ) {
238     myTextMargin = theMargin;
239     Modified();
240   }
241 }
242
243 //==================================================================
244 // function : GetTextMargin
245 // purpose  :
246 //==================================================================
247 int VTKViewer_FramedTextActor::GetTextMargin() const
248 {
249   return myTextMargin;
250 }
251
252 //==================================================================
253 // function : SetOffset
254 // purpose  :
255 //==================================================================
256 void VTKViewer_FramedTextActor::SetOffset(const double theOffset[2])
257 {
258   myHorizontalOffset = theOffset[0];
259   myVerticalOffset = theOffset[1];
260   Modified();
261 }
262
263 //==================================================================
264 // function : SetText
265 // purpose  :
266 //==================================================================
267 void VTKViewer_FramedTextActor::SetText(const char* theText)
268 {
269   // remove whitespaces from from the start and the end
270   // additionally, consider a case of multi-string text
271   QString aString(QString::fromUtf8(theText));
272
273   QStringList aTrimmedStringList;
274   QStringList aStringList = aString.split("\n");
275   QStringListIterator anIter(aStringList);
276   while(anIter.hasNext())
277     aTrimmedStringList.append(anIter.next().trimmed());
278
279   myTextActor->SetInput(aTrimmedStringList.join("\n").toUtf8().constData());
280   Modified();
281 }
282
283 //==================================================================
284 // function : GetText
285 // purpose  :
286 //==================================================================
287 char* VTKViewer_FramedTextActor::GetText()
288 {
289   return myTextActor->GetInput();
290 }
291
292 //==================================================================
293 // function : SetModePosition
294 // purpose  :
295 //==================================================================
296 void VTKViewer_FramedTextActor::SetModePosition(const int theMode)
297 {
298   myModePosition = theMode;
299   Modified();
300 }
301
302 //==================================================================
303 // function : GetModePosition
304 // purpose  :
305 //==================================================================
306 int VTKViewer_FramedTextActor::GetModePosition()const
307 {
308   return myModePosition;
309 }
310
311 //==================================================================
312 // function : SetLayoutType
313 // purpose  :
314 //==================================================================
315 void VTKViewer_FramedTextActor::SetLayoutType(const int theType)
316 {
317   myLayoutType = theType;
318   Modified();
319 }
320
321 //==================================================================
322 // function : GetLayoutType
323 // purpose  :
324 //==================================================================
325 int VTKViewer_FramedTextActor::GetLayoutType() const
326 {
327   return myLayoutType;
328 }
329
330 //==================================================================
331 // function : SetWorldPoint
332 // purpose  :
333 //==================================================================
334 void VTKViewer_FramedTextActor::SetWorldPoint(const double theWorldPoint[4])
335 {
336   for(int i = 0; i<4; ++i) {
337     myWorldPoint[i] = theWorldPoint[i];
338   } 
339   Modified();
340 }
341
342 //==================================================================
343 // function : GetWorldPoint
344 // purpose  :
345 //==================================================================
346 const double* VTKViewer_FramedTextActor::GetWorldPoint()const 
347 {
348   return myWorldPoint;
349 }
350
351 //==================================================================
352 // function : SetDistance
353 // purpose  :
354 //==================================================================
355 void VTKViewer_FramedTextActor::SetDistance(const double theDistance)
356 {
357   myDistance=theDistance;
358 }
359
360 //==================================================================
361 // function : GetDistance
362 // purpose  :
363 //==================================================================
364 double VTKViewer_FramedTextActor::GetDistance()const
365 {
366   return myDistance;
367 }
368
369 //==================================================================
370 // function : SetMoveFrameFlag
371 // purpose  : If moveFrameFlag is true, then frame with text is moved
372 //            under world point
373 //==================================================================
374 void VTKViewer_FramedTextActor::SetMoveFrameFlag(const int theMoveFrameFlag)
375 {
376   if(myMoveFrameFlag != theMoveFrameFlag) {
377     myMoveFrameFlag = theMoveFrameFlag;
378     Modified();
379   }
380 }
381
382 //==================================================================
383 // function : GetDistance
384 // purpose  :
385 //==================================================================
386 int VTKViewer_FramedTextActor::GetMoveFrameFlag() const
387 {
388   return myMoveFrameFlag;
389 }
390
391
392 //==================================================================
393 // function : ReleaseGraphicsResources
394 // purpose  :
395 //==================================================================
396 void VTKViewer_FramedTextActor::ReleaseGraphicsResources(vtkWindow *win)
397 {
398   myTextActor->ReleaseGraphicsResources(win);
399   myBarActor->ReleaseGraphicsResources(win);
400 }
401
402 //==================================================================
403 // function : RenderOverlay
404 // purpose  :
405 //==================================================================
406 int VTKViewer_FramedTextActor::RenderOverlay(vtkViewport *viewport)
407 {
408   int renderedSomething = 0;
409   renderedSomething +=myTextActor->RenderOverlay(viewport);
410   renderedSomething +=myBarActor->RenderOverlay(viewport);
411   return renderedSomething;
412 }
413
414 //==================================================================
415 // function : RenderOpaqueGeometry
416 // purpose  :
417 //==================================================================
418 int 
419 VTKViewer_FramedTextActor
420 ::RenderOpaqueGeometry(vtkViewport *theViewport)
421 {
422   int anIsRenderedSomething = 0;
423
424   int* aViewportSize = theViewport->GetSize();
425   int aViewPortWidth = aViewportSize[0];
426   int aViewPortHeight = aViewportSize[1];
427   if(aViewPortWidth == 1 || aViewPortHeight == 1)
428     return anIsRenderedSomething;
429
430   if(!myTextActor->GetInput())
431     return anIsRenderedSomething;
432
433   myBar->Initialize();
434
435   int aNbPoints = 4;
436   vtkPoints *aPoints = vtkPoints::New();
437   aPoints->SetNumberOfPoints(aNbPoints);
438   myBar->SetPoints(aPoints);
439   aPoints->Delete();
440
441   vtkCellArray *aPolys = vtkCellArray::New();
442   aPolys->Allocate(aPolys->EstimateSize(1,4));
443   vtkIdType aPointsIds[4] = {0, 1, 3, 2};
444   aPolys->InsertNextCell(4,aPointsIds);
445   myBar->SetPolys(aPolys);
446   aPolys->Delete(); 
447
448   double aTextSize[2]; 
449   myTextActor->GetSize(theViewport, aTextSize);
450   int aBarWidth = aTextSize[0];
451   int aBarHeight = aTextSize[1];
452
453   int aTextMargin = GetTextMargin();
454
455   double xMin = 0.0;
456   double xMax = 0.0;
457   double yMin = -aBarHeight/2 - aTextMargin;
458   double yMax =  aBarHeight/2 + aTextMargin;
459
460   int aHorizontalOffset = GetLayoutType() == Horizontal ? myHorizontalOffset : 0;
461   int aVerticalOffset = GetLayoutType() == Vertical ? myVerticalOffset : 0;
462
463   if( myModePosition == BelowPoint )
464   {
465     theViewport->SetWorldPoint(myWorldPoint);
466     theViewport->WorldToDisplay();
467
468     double aSelectionPoint[3];
469     theViewport->GetDisplayPoint(aSelectionPoint);
470     double u = aSelectionPoint[0];
471     double v = aSelectionPoint[1] - myDistance;
472     if(myMoveFrameFlag)
473       v -= aBarHeight/2.;
474     theViewport->ViewportToNormalizedViewport(u, v);
475     PositionCoordinate->SetValue(u, v);
476
477     myTextProperty->SetJustificationToCentered();
478
479     xMin = -aBarWidth/2 - aTextMargin;
480     xMax =  aBarWidth/2 + aTextMargin;
481   }
482   else // except BelowPoint, only TopLeft and TopRight modes are supported at this moment
483   {
484     double x = 0, xOffset = aHorizontalOffset + aTextMargin + OFFSET_SPACING;
485     double y = 0, yOffset = aVerticalOffset + aTextMargin + OFFSET_SPACING;
486
487     if( myModePosition == TopLeft )
488     {
489       x = xOffset;
490       y = aViewPortHeight - yOffset - aBarHeight/2;
491       myTextProperty->SetJustificationToLeft();
492
493       xMin =            - aTextMargin;
494       xMax =  aBarWidth + aTextMargin;
495     }
496     else if( myModePosition == TopRight )
497     {
498       x = aViewPortWidth - xOffset;
499       y = aViewPortHeight - yOffset - aBarHeight/2;
500       myTextProperty->SetJustificationToRight();
501
502       xMin = -aBarWidth - aTextMargin;
503       xMax =              aTextMargin;
504     }
505
506     PositionCoordinate->SetValue(x / (double)aViewPortWidth,
507                                  y / (double)aViewPortHeight);
508   }
509
510
511   aPoints->SetPoint(0, xMin, yMax, 0.0);
512   aPoints->SetPoint(1, xMin, yMin, 0.0);
513   aPoints->SetPoint(2, xMax, yMax, 0.0);
514   aPoints->SetPoint(3, xMax, yMin, 0.0);
515
516   myTextProperty->SetVerticalJustificationToCentered();
517
518   myBarActor ->GetPositionCoordinate()->SetReferenceCoordinate(PositionCoordinate);
519   myTextActor->GetPositionCoordinate()->SetReferenceCoordinate(PositionCoordinate);
520
521   myBuildTime.Modified();
522
523   return anIsRenderedSomething;
524 }