Salome HOME
a9877109f7895952d34e856bb6a4aec1ad606aa0
[modules/smesh.git] / src / OBJECT / SMESH_Actor.cxx
1 //  SMESH OBJECT : interactive object for SMESH visualization
2 //
3 //  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
5 // 
6 //  This library is free software; you can redistribute it and/or 
7 //  modify it under the terms of the GNU Lesser General Public 
8 //  License as published by the Free Software Foundation; either 
9 //  version 2.1 of the License. 
10 // 
11 //  This library is distributed in the hope that it will be useful, 
12 //  but WITHOUT ANY WARRANTY; without even the implied warranty of 
13 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
14 //  Lesser General Public License for more details. 
15 // 
16 //  You should have received a copy of the GNU Lesser General Public 
17 //  License along with this library; if not, write to the Free Software 
18 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
19 // 
20 //  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
21 //
22 //
23 //
24 //  File   : SMESH_Actor.cxx
25 //  Author : Nicolas REJNERI
26 //  Module : SMESH
27 //  $Header$
28
29
30 #include "SMESH_ActorDef.h"
31 #include "SMESH_ActorUtils.h"
32 #include "SMESH_DeviceActor.h"
33 #include "SMESH_ControlsDef.hxx"
34 #include <VTKViewer_ExtractUnstructuredGrid.h>
35
36 #include "SUIT_Session.h"
37 #include "SUIT_ResourceMgr.h"
38
39 #include <qstringlist.h>
40
41 #include <vtkTimeStamp.h>
42 #include <vtkObjectFactory.h>
43 #include <vtkShrinkPolyData.h>
44 #include <vtkMergeFilter.h>
45
46 #include <vtkMatrix4x4.h>
47 #include <vtkUnstructuredGrid.h>
48 #include <vtkPointData.h>
49 #include <vtkCellData.h>
50
51 #include <vtkMapper.h>
52 #include <vtkRenderer.h>
53
54 #include <vtkCell.h>
55 #include <vtkIdList.h>
56 #include <vtkIntArray.h>
57
58 #include <vtkActor2D.h>
59 #include <vtkProperty2D.h>
60 #include <vtkPolyData.h>
61 #include <vtkMaskPoints.h>
62 #include <vtkCellCenters.h>
63 #include <vtkTextProperty.h>
64 #include <vtkLabeledDataMapper.h>
65 #include <vtkSelectVisiblePoints.h>
66
67 #include <vtkScalarBarActor.h>
68 #include <vtkLookupTable.h>
69
70 #include <vtkMath.h>
71 #include <vtkPlane.h>
72 #include <vtkImplicitBoolean.h>
73 #include <vtkImplicitFunctionCollection.h>
74
75 #include "utilities.h"
76
77 #ifdef _DEBUG_
78 static int MYDEBUG = 1;
79 #else
80 static int MYDEBUG = 0;
81 #endif
82
83 static int aLineWidthInc = 2;
84 static int aPointSizeInc = 2;
85
86
87 SMESH_ActorDef* SMESH_ActorDef::New(){
88   return new SMESH_ActorDef();
89 }
90
91
92 SMESH_Actor* SMESH_Actor::New(TVisualObjPtr theVisualObj, 
93                               const char* theEntry, 
94                               const char* theName,
95                               int theIsClear)
96 {
97   SMESH_ActorDef* anActor = SMESH_ActorDef::New();
98   if(!anActor->Init(theVisualObj,theEntry,theName,theIsClear)){
99     anActor->Delete();
100     anActor = NULL;
101   }
102   return anActor;
103 }
104
105
106 SMESH_ActorDef::SMESH_ActorDef()
107 {
108   if(MYDEBUG) MESSAGE("SMESH_ActorDef - "<<this);
109
110   myTimeStamp = vtkTimeStamp::New();
111
112   myIsPointsVisible = false;
113
114   myIsShrinkable = false;
115   myIsShrunk = false;
116
117   myControlsPrecision = (long)SMESH::GetFloat( "SMESH:controls_precision", -1 );
118
119   float aPointSize = SMESH::GetFloat("SMESH:node_size",3);
120   float aLineWidth = SMESH::GetFloat("SMESH:element_width",1);
121
122   vtkMatrix4x4 *aMatrix = vtkMatrix4x4::New();
123   VTKViewer_ExtractUnstructuredGrid* aFilter = NULL;
124
125   //Definition 2D and 3D divices of the actor
126   //-----------------------------------------
127   float anRGB[3] = {1,1,1};
128   mySurfaceProp = vtkProperty::New();
129   SMESH::GetColor( "SMESH", "fill_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 170, 255 ) );
130   mySurfaceProp->SetColor( anRGB[0], anRGB[1], anRGB[2] );
131
132   myBackSurfaceProp = vtkProperty::New();
133   SMESH::GetColor( "SMESH", "backface_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 0, 255 ) );
134   myBackSurfaceProp->SetColor( anRGB[0], anRGB[1], anRGB[2] );
135
136   my2DActor = SMESH_DeviceActor::New();
137   my2DActor->SetUserMatrix(aMatrix);
138   my2DActor->PickableOff();
139   my2DActor->SetProperty(mySurfaceProp);
140   my2DActor->SetBackfaceProperty(myBackSurfaceProp);
141   my2DActor->SetRepresentation(SMESH_DeviceActor::eSurface);
142   aFilter = my2DActor->GetExtractUnstructuredGrid();
143   aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding);
144   aFilter->RegisterCellsWithType(VTK_TRIANGLE);
145   aFilter->RegisterCellsWithType(VTK_POLYGON);
146   aFilter->RegisterCellsWithType(VTK_QUAD);
147
148   my3DActor = SMESH_DeviceActor::New();
149   my3DActor->SetUserMatrix(aMatrix);
150   my3DActor->PickableOff();
151   my3DActor->SetProperty(mySurfaceProp);
152   my3DActor->SetBackfaceProperty(myBackSurfaceProp);
153   my3DActor->SetRepresentation(SMESH_DeviceActor::eSurface);
154   aFilter = my3DActor->GetExtractUnstructuredGrid();
155   aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding);
156   aFilter->RegisterCellsWithType(VTK_TETRA);
157   aFilter->RegisterCellsWithType(VTK_VOXEL);
158   aFilter->RegisterCellsWithType(VTK_HEXAHEDRON);
159   aFilter->RegisterCellsWithType(VTK_WEDGE);
160   aFilter->RegisterCellsWithType(VTK_PYRAMID);
161   aFilter->RegisterCellsWithType(VTK_CONVEX_POINT_SET);
162
163   //Definition 1D divice of the actor
164   //---------------------------------
165   myEdgeProp = vtkProperty::New();
166   myEdgeProp->SetAmbient(1.0);
167   myEdgeProp->SetDiffuse(0.0);
168   myEdgeProp->SetSpecular(0.0);
169   SMESH::GetColor( "SMESH", "outline_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 170, 255 ) );
170   myEdgeProp->SetColor(anRGB[0],anRGB[1],anRGB[2]);
171   myEdgeProp->SetLineWidth(aLineWidth);
172
173   my1DActor = SMESH_DeviceActor::New();
174   my1DActor->SetUserMatrix(aMatrix);
175   my1DActor->PickableOff();
176   my1DActor->SetHighlited(true);
177   my1DActor->SetProperty(myEdgeProp);
178   my1DActor->SetRepresentation(SMESH_DeviceActor::eSurface);
179   aFilter = my1DActor->GetExtractUnstructuredGrid();
180   aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding);
181   aFilter->RegisterCellsWithType(VTK_LINE);
182
183   my1DProp = vtkProperty::New();
184   my1DProp->DeepCopy(myEdgeProp);
185   my1DProp->SetLineWidth(aLineWidth + aLineWidthInc);
186   my1DProp->SetPointSize(aPointSize);
187
188   my1DExtProp = vtkProperty::New();
189   my1DExtProp->DeepCopy(myEdgeProp);
190   anRGB[0] = 1 - anRGB[0];
191   anRGB[1] = 1 - anRGB[1];
192   anRGB[2] = 1 - anRGB[2];
193   my1DExtProp->SetColor(anRGB[0],anRGB[1],anRGB[2]);
194   my1DExtProp->SetLineWidth(aLineWidth + aLineWidthInc);
195   my1DExtProp->SetPointSize(aPointSize + aPointSizeInc);
196
197   my1DExtActor = SMESH_DeviceActor::New();
198   my1DExtActor->SetUserMatrix(aMatrix);
199   my1DExtActor->PickableOff();
200   my1DExtActor->SetHighlited(true);
201   my1DExtActor->SetVisibility(false);
202   my1DExtActor->SetProperty(my1DExtProp);
203   my1DExtActor->SetRepresentation(SMESH_DeviceActor::eInsideframe);
204   aFilter = my1DExtActor->GetExtractUnstructuredGrid();
205   aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding);
206   aFilter->RegisterCellsWithType(VTK_LINE);
207
208
209   //Definition 0D divice of the actor
210   //---------------------------------
211   myNodeProp = vtkProperty::New();
212   SMESH::GetColor( "SMESH", "node_color", anRGB[0], anRGB[1], anRGB[2], QColor( 255, 0, 0 ) );
213   myNodeProp->SetColor(anRGB[0],anRGB[1],anRGB[2]);
214   myNodeProp->SetPointSize(aPointSize);
215
216   myNodeActor = SMESH_DeviceActor::New();
217   myNodeActor->SetUserMatrix(aMatrix);
218   myNodeActor->SetStoreClippingMapping(true);
219   myNodeActor->PickableOff();
220   myNodeActor->SetVisibility(false);
221   myNodeActor->SetProperty(myNodeProp);
222   myNodeActor->SetRepresentation(SMESH_DeviceActor::ePoint);
223   aFilter = myNodeActor->GetExtractUnstructuredGrid();
224   aFilter->SetModeOfExtraction(VTKViewer_ExtractUnstructuredGrid::ePoints);
225
226
227   //Definition of Pickable and Highlitable engines
228   //----------------------------------------------
229
230   myBaseActor = SMESH_DeviceActor::New();
231   myBaseActor->SetUserMatrix(aMatrix);
232   myBaseActor->SetStoreGemetryMapping(true);
233   myBaseActor->GetProperty()->SetOpacity(0.0);
234
235   myPickableActor = myBaseActor;
236   
237   myHighlightProp = vtkProperty::New();
238   myHighlightProp->SetAmbient(1.0);
239   myHighlightProp->SetDiffuse(0.0);
240   myHighlightProp->SetSpecular(0.0);
241   SMESH::GetColor( "SMESH", "selection_object_color", anRGB[0], anRGB[1], anRGB[2], QColor( 255, 255, 255 ) );
242   myHighlightProp->SetColor(anRGB[0],anRGB[1],anRGB[2]);
243   myHighlightProp->SetPointSize(aPointSize);
244   myHighlightProp->SetRepresentation(1);
245  
246   myPreselectProp = vtkProperty::New();
247   myPreselectProp->SetAmbient(1.0);
248   myPreselectProp->SetDiffuse(0.0);
249   myPreselectProp->SetSpecular(0.0);
250   SMESH::GetColor( "SMESH", "highlight_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 255, 255 ) );
251   myPreselectProp->SetColor(anRGB[0],anRGB[1],anRGB[2]);
252   myPreselectProp->SetPointSize(aPointSize);
253   myPreselectProp->SetRepresentation(1);
254
255   myHighlitableActor = SMESH_DeviceActor::New();
256   myHighlitableActor->SetUserMatrix(aMatrix);
257   myHighlitableActor->PickableOff();
258   myHighlitableActor->SetRepresentation(SMESH_DeviceActor::eWireframe);
259
260   SetShrinkFactor( SMESH::GetFloat( "SMESH", "shrink_coeff", 0.75 ) );
261
262   myName = "";
263   myIO = NULL;
264
265   myControlMode = eNone;
266   myControlActor = my2DActor;
267
268   //Definition of myScalarBarActor
269   //------------------------------
270   myLookupTable = vtkLookupTable::New();
271   //Fix for Bug PAL5195 - SMESH764: 
272   //Controls - Aspect Ratio: incorrect colors of the best and worst values
273   myLookupTable->SetHueRange(0.667,0.0);
274
275   myScalarBarActor = vtkScalarBarActor::New();
276   myScalarBarActor->SetVisibility(false);
277   myScalarBarActor->SetLookupTable(myLookupTable);
278
279   vtkTextProperty* aScalarBarTitleProp = vtkTextProperty::New();
280
281   SUIT_ResourceMgr* mgr = SUIT_Session::session()->resourceMgr();
282   if( !mgr )
283     return;
284
285   QColor aTColor = mgr->colorValue( "SMESH", "scalar_bar_title_color", QColor( 255, 255, 255 ) );
286   aScalarBarTitleProp->SetColor( aTColor.red()/255., aTColor.green()/255., aTColor.blue()/255. );
287
288   aScalarBarTitleProp->SetFontFamilyToArial();
289   
290   if ( mgr->hasValue( "SMESH", "scalar_bar_title_font" ) )
291   {
292     QFont f = mgr->fontValue( "SMESH", "scalar_bar_title_font" );
293     if ( f.family() == "Arial" )
294       aScalarBarTitleProp->SetFontFamilyToArial();
295     else if ( f.family() == "Courier" )
296       aScalarBarTitleProp->SetFontFamilyToCourier();
297     else if ( f.family() == "Times" )
298       aScalarBarTitleProp->SetFontFamilyToTimes();
299
300     if ( f.bold() )
301       aScalarBarTitleProp->BoldOn();
302     else
303       aScalarBarTitleProp->BoldOff();
304
305     if ( f.italic() )
306       aScalarBarTitleProp->ItalicOn();
307     else
308      aScalarBarTitleProp->ItalicOff();
309
310     if ( f.underline() )
311       aScalarBarTitleProp->ShadowOn();
312     else
313       aScalarBarTitleProp->ShadowOff();
314   }
315
316   myScalarBarActor->SetTitleTextProperty( aScalarBarTitleProp );
317   aScalarBarTitleProp->Delete();
318
319   vtkTextProperty* aScalarBarLabelProp = vtkTextProperty::New();
320
321   aTColor = mgr->colorValue( "SMESH", "scalar_bar_label_color", QColor( 255, 255, 255 ) );
322   aScalarBarLabelProp->SetColor( aTColor.red()/255., aTColor.green()/255., aTColor.blue()/255. );
323
324   aScalarBarLabelProp->SetFontFamilyToArial();
325   if( mgr->hasValue( "SMESH", "scalar_bar_label_font" ) )
326   {
327     QFont f = mgr->stringValue( "SMESH", "scalar_bar_label_font" );
328     if( f.family() == "Arial" )
329       aScalarBarLabelProp->SetFontFamilyToArial();
330     else if( f.family() == "Courier" )
331       aScalarBarLabelProp->SetFontFamilyToCourier();
332     else if( f.family() == "Times" )
333       aScalarBarLabelProp->SetFontFamilyToTimes();
334       
335     if ( f.bold() )
336       aScalarBarLabelProp->BoldOn();
337     else
338       aScalarBarLabelProp->BoldOff();
339
340     if ( f.italic() )
341       aScalarBarLabelProp->ItalicOn();
342     else
343       aScalarBarLabelProp->ItalicOff();
344
345     if( f.underline() )
346       aScalarBarLabelProp->ShadowOn();
347     else
348       aScalarBarLabelProp->ShadowOff();
349   }
350
351   myScalarBarActor->SetLabelTextProperty( aScalarBarLabelProp );
352   aScalarBarLabelProp->Delete();
353
354   bool horiz = ( mgr->integerValue( "SMESH", "scalar_bar_orientation" ) == 1 );
355   QString name = QString( "scalar_bar_%1_" ).arg( horiz ? "horizontal" : "vertical" );
356   if( horiz )
357     myScalarBarActor->SetOrientationToHorizontal();
358   else
359     myScalarBarActor->SetOrientationToVertical();
360  
361
362   float aXVal = horiz ? 0.20 : 0.01;
363   if( mgr->hasValue( "SMESH", name + "x" ) )
364     aXVal = mgr->doubleValue( "SMESH", name + "x", aXVal );
365     
366   float aYVal = horiz ? 0.01 : 0.1;
367   if( mgr->hasValue( "SMESH", name + "y" ) )
368     aYVal = mgr->doubleValue( "SMESH", name + "y", aYVal );
369   myScalarBarActor->SetPosition( aXVal, aYVal );
370
371   float aWVal = horiz ? 0.60 : 0.10;
372   if( mgr->hasValue( "SMESH", name + "width" ) )
373     aWVal = mgr->doubleValue( "SMESH", name + "width", aWVal );
374   myScalarBarActor->SetWidth( aWVal );
375
376   float aHVal = horiz ? 0.12 : 0.80;
377   if( mgr->hasValue( "SMESH", name + "height" ) )
378     aHVal = mgr->doubleValue( "SMESH", name + "height", aHVal );
379   myScalarBarActor->SetHeight( aHVal );
380
381   int anIntVal = 5;
382   if( mgr->hasValue( "SMESH", "scalar_bar_num_labels" ) )
383     anIntVal = mgr->integerValue( "SMESH", "scalar_bar_num_labels", anIntVal );
384   myScalarBarActor->SetNumberOfLabels( anIntVal == 0 ? 5: anIntVal );
385
386   anIntVal = 64;
387   if( mgr->hasValue( "SMESH", "scalar_bar_num_colors" ) )
388     anIntVal = mgr->integerValue( "SMESH", "scalar_bar_num_colors", anIntVal );
389   myScalarBarActor->SetMaximumNumberOfColors( anIntVal == 0 ? 64 : anIntVal );
390
391
392   //Definition of points numbering pipeline
393   //---------------------------------------
394   myPointsNumDataSet = vtkUnstructuredGrid::New();
395
396   myPtsMaskPoints = vtkMaskPoints::New();
397   myPtsMaskPoints->SetInput(myPointsNumDataSet);
398   myPtsMaskPoints->SetOnRatio(1);
399
400   myPtsSelectVisiblePoints = vtkSelectVisiblePoints::New();
401   myPtsSelectVisiblePoints->SetInput(myPtsMaskPoints->GetOutput());
402   myPtsSelectVisiblePoints->SelectInvisibleOff();
403   myPtsSelectVisiblePoints->SetTolerance(0.1);
404     
405   myPtsLabeledDataMapper = vtkLabeledDataMapper::New();
406   myPtsLabeledDataMapper->SetInput(myPtsSelectVisiblePoints->GetOutput());
407   myPtsLabeledDataMapper->SetLabelFormat("%g");
408   myPtsLabeledDataMapper->SetLabelModeToLabelScalars();
409     
410   vtkTextProperty* aPtsTextProp = vtkTextProperty::New();
411   aPtsTextProp->SetFontFamilyToTimes();
412   static int aPointsFontSize = 10;
413   aPtsTextProp->SetFontSize(aPointsFontSize);
414   aPtsTextProp->SetBold(1);
415   aPtsTextProp->SetItalic(0);
416   aPtsTextProp->SetShadow(0);
417   myPtsLabeledDataMapper->SetLabelTextProperty(aPtsTextProp);
418   aPtsTextProp->Delete();
419   
420   myEntityMode = eAllEntity;
421
422   myIsPointsLabeled = false;
423
424   myPointLabels = vtkActor2D::New();
425   myPointLabels->SetMapper(myPtsLabeledDataMapper);
426   myPointLabels->GetProperty()->SetColor(1,1,1);
427   myPointLabels->SetVisibility(myIsPointsLabeled);
428
429
430   //Definition of cells numbering pipeline
431   //---------------------------------------
432   myCellsNumDataSet = vtkUnstructuredGrid::New();
433
434   myCellCenters = vtkCellCenters::New();
435   myCellCenters->SetInput(myCellsNumDataSet);
436
437   myClsMaskPoints = vtkMaskPoints::New();
438   myClsMaskPoints->SetInput(myCellCenters->GetOutput());
439   myClsMaskPoints->SetOnRatio(1);
440     
441   myClsSelectVisiblePoints = vtkSelectVisiblePoints::New();
442   myClsSelectVisiblePoints->SetInput(myClsMaskPoints->GetOutput());
443   myClsSelectVisiblePoints->SelectInvisibleOff();
444   myClsSelectVisiblePoints->SetTolerance(0.1);
445     
446   myClsLabeledDataMapper = vtkLabeledDataMapper::New();
447   myClsLabeledDataMapper->SetInput(myClsSelectVisiblePoints->GetOutput());
448   myClsLabeledDataMapper->SetLabelFormat("%g");
449   myClsLabeledDataMapper->SetLabelModeToLabelScalars();
450     
451   vtkTextProperty* aClsTextProp = vtkTextProperty::New();
452   aClsTextProp->SetFontFamilyToTimes();
453   static int aCellsFontSize = 12;
454   aClsTextProp->SetFontSize(aCellsFontSize);
455   aClsTextProp->SetBold(1);
456   aClsTextProp->SetItalic(0);
457   aClsTextProp->SetShadow(0);
458   myClsLabeledDataMapper->SetLabelTextProperty(aClsTextProp);
459   aClsTextProp->Delete();
460     
461   myIsCellsLabeled = false;
462
463   myCellsLabels = vtkActor2D::New();
464   myCellsLabels->SetMapper(myClsLabeledDataMapper);
465   myCellsLabels->GetProperty()->SetColor(0,1,0);
466   myCellsLabels->SetVisibility(myIsCellsLabeled);
467
468   // Clipping planes
469   myImplicitBoolean = vtkImplicitBoolean::New();
470   myImplicitBoolean->SetOperationTypeToIntersection();
471 }
472
473
474 SMESH_ActorDef::~SMESH_ActorDef()
475 {
476   if(MYDEBUG) MESSAGE("~SMESH_ActorDef - "<<this);
477
478   myScalarBarActor->Delete();
479   myLookupTable->Delete();
480
481   mySurfaceProp->Delete();
482   myBackSurfaceProp->Delete();
483
484   myEdgeProp->Delete();
485   myHighlightProp->Delete();
486   myPreselectProp->Delete();
487
488   myNodeProp->Delete();
489
490   my1DProp->Delete();
491   my1DActor->Delete();
492
493   my1DExtProp->Delete();
494   my1DExtActor->Delete();
495
496   my2DActor->Delete();
497   my3DActor->Delete();
498
499   myNodeActor->Delete();
500   myBaseActor->Delete();
501
502   myHighlitableActor->Delete();
503
504   //Deleting of pints numbering pipeline
505   //---------------------------------------
506   myPointsNumDataSet->Delete();
507
508   myPtsLabeledDataMapper->RemoveAllInputs();
509   myPtsLabeledDataMapper->Delete();
510
511   myPtsSelectVisiblePoints->UnRegisterAllOutputs();
512   myPtsSelectVisiblePoints->Delete();
513
514   myPtsMaskPoints->UnRegisterAllOutputs();
515   myPtsMaskPoints->Delete();
516
517   myPointLabels->Delete();
518
519
520   //Deleting of cells numbering pipeline
521   //---------------------------------------
522   myCellsNumDataSet->Delete();
523
524   myClsLabeledDataMapper->RemoveAllInputs();
525   myClsLabeledDataMapper->Delete();
526
527   myClsSelectVisiblePoints->UnRegisterAllOutputs();
528   myClsSelectVisiblePoints->Delete();
529
530   myClsMaskPoints->UnRegisterAllOutputs();
531   myClsMaskPoints->Delete();
532
533   myCellCenters->UnRegisterAllOutputs();
534   myCellCenters->Delete();
535
536   myCellsLabels->Delete();
537
538   myImplicitBoolean->Delete();
539
540   myTimeStamp->Delete();
541 }
542
543
544 void SMESH_ActorDef::SetPointsLabeled( bool theIsPointsLabeled )
545 {
546   vtkUnstructuredGrid* aGrid = GetUnstructuredGrid();
547   myIsPointsLabeled = theIsPointsLabeled && aGrid->GetNumberOfPoints();
548
549   if ( myIsPointsLabeled )
550   {
551     myPointsNumDataSet->ShallowCopy(aGrid);
552     vtkDataSet *aDataSet = myPointsNumDataSet;
553     
554     int aNbElem = aDataSet->GetNumberOfPoints();
555     
556     vtkIntArray *anArray = vtkIntArray::New();
557     anArray->SetNumberOfValues( aNbElem );
558     
559     for ( int anId = 0; anId < aNbElem; anId++ )
560     {
561       int aSMDSId = myVisualObj->GetNodeObjId( anId );
562       anArray->SetValue( anId, aSMDSId );
563     }
564     
565     aDataSet->GetPointData()->SetScalars( anArray );
566     anArray->Delete();
567     myPtsMaskPoints->SetInput( aDataSet );
568     myPointLabels->SetVisibility( GetVisibility() );
569   }
570   else
571   {
572     myPointLabels->SetVisibility( false );
573   }
574   SetRepresentation(GetRepresentation());
575   myTimeStamp->Modified();
576 }
577
578
579 void SMESH_ActorDef::SetCellsLabeled(bool theIsCellsLabeled)
580 {
581   vtkUnstructuredGrid* aGrid = GetUnstructuredGrid();
582   myIsCellsLabeled = theIsCellsLabeled && aGrid->GetNumberOfPoints();
583   if(myIsCellsLabeled){
584     myCellsNumDataSet->ShallowCopy(aGrid);
585     vtkDataSet *aDataSet = myCellsNumDataSet;
586     int aNbElem = aDataSet->GetNumberOfCells();
587     vtkIntArray *anArray = vtkIntArray::New();
588     anArray->SetNumberOfValues(aNbElem);
589     for(int anId = 0; anId < aNbElem; anId++){
590       int aSMDSId = myVisualObj->GetElemObjId(anId);
591       anArray->SetValue(anId,aSMDSId);
592     }
593     aDataSet->GetCellData()->SetScalars(anArray);
594     myCellCenters->SetInput(aDataSet);
595     myCellsLabels->SetVisibility(GetVisibility());
596   }else{
597     myCellsLabels->SetVisibility(false);
598   }
599   myTimeStamp->Modified();
600 }
601
602
603 void 
604 SMESH_ActorDef::
605 SetControlMode(eControl theMode)
606 {
607   SetControlMode(theMode,true);
608 }
609
610
611 void 
612 SMESH_ActorDef::
613 SetControlMode(eControl theMode,
614                bool theCheckEntityMode)
615 {
616   SUIT_ResourceMgr* mgr = SUIT_Session::session()->resourceMgr();  
617   if( !mgr )
618     return;
619
620   myControlMode = eNone;
621   theCheckEntityMode &= mgr->booleanValue( "SMESH", "display_entity", false );
622
623   my1DActor->GetMapper()->SetScalarVisibility(false);
624   my2DActor->GetMapper()->SetScalarVisibility(false);
625   my3DActor->GetMapper()->SetScalarVisibility(false);
626   myScalarBarActor->SetVisibility(false);
627
628   bool anIsScalarVisible = theMode > eNone;
629
630   if(anIsScalarVisible){
631     SMESH::Controls::FunctorPtr aFunctor;
632     switch(theMode){
633     case eLength:
634     {
635       SMESH::Controls::Length* aControl = new SMESH::Controls::Length();
636       aControl->SetPrecision( myControlsPrecision );
637       aFunctor.reset( aControl );
638       myControlActor = my1DActor;
639       break;
640     }
641     case eLength2D:
642     {
643       aFunctor.reset(new SMESH::Controls::Length2D());
644       myControlActor = my2DActor;
645       break;
646     }
647     case eFreeBorders:
648       aFunctor.reset(new SMESH::Controls::FreeBorders());
649       myControlActor = my1DActor;
650       break;
651     case eFreeEdges:
652       aFunctor.reset(new SMESH::Controls::FreeEdges());
653       myControlActor = my2DActor;
654       break;
655     case eMultiConnection:
656       aFunctor.reset(new SMESH::Controls::MultiConnection());
657       myControlActor = my1DActor;
658       break;
659     case eMultiConnection2D:
660       aFunctor.reset(new SMESH::Controls::MultiConnection2D());
661       myControlActor = my2DActor;
662       break;
663     case eArea:
664     {
665       SMESH::Controls::Area* aControl = new SMESH::Controls::Area();
666       aControl->SetPrecision( myControlsPrecision );
667       aFunctor.reset( aControl );
668       myControlActor = my2DActor;
669       break;
670     }
671     case eTaper:
672     {
673       SMESH::Controls::Taper* aControl = new SMESH::Controls::Taper();
674       aControl->SetPrecision( myControlsPrecision );
675       aFunctor.reset( aControl );
676       myControlActor = my2DActor;
677       break;
678     }
679     case eAspectRatio:
680     {
681       SMESH::Controls::AspectRatio* aControl = new SMESH::Controls::AspectRatio();
682       aControl->SetPrecision( myControlsPrecision );
683       aFunctor.reset( aControl );
684       myControlActor = my2DActor;
685       break;
686     }
687     case eAspectRatio3D:
688     {
689       SMESH::Controls::AspectRatio3D* aControl = new SMESH::Controls::AspectRatio3D();
690       aControl->SetPrecision( myControlsPrecision );
691       aFunctor.reset( aControl );
692       myControlActor = my3DActor;
693       break;
694     }
695     case eMinimumAngle:
696     {
697       SMESH::Controls::MinimumAngle* aControl = new SMESH::Controls::MinimumAngle();
698       aControl->SetPrecision( myControlsPrecision );
699       aFunctor.reset( aControl );
700       myControlActor = my2DActor;
701       break;
702     }
703     case eWarping:
704     {
705       SMESH::Controls::Warping* aControl = new SMESH::Controls::Warping();
706       aControl->SetPrecision( myControlsPrecision );
707       aFunctor.reset( aControl );
708       myControlActor = my2DActor;
709       break;
710     }
711     case eSkew:
712     {
713       SMESH::Controls::Skew* aControl = new SMESH::Controls::Skew();
714       aControl->SetPrecision( myControlsPrecision );
715       aFunctor.reset( aControl );
716       myControlActor = my2DActor;
717       break;
718     }
719     default:
720       return;
721     }
722
723     vtkUnstructuredGrid* aGrid = myControlActor->GetUnstructuredGrid();
724     vtkIdType aNbCells = aGrid->GetNumberOfCells();
725     if(aNbCells){
726       myControlMode = theMode;
727       switch(myControlMode){
728       case eFreeEdges:
729       case eFreeBorders:
730         my1DExtActor->SetExtControlMode(aFunctor);
731         break;
732       case eLength2D:
733       case eMultiConnection2D:
734         my1DExtActor->SetExtControlMode(aFunctor,myScalarBarActor,myLookupTable);
735         break;
736       default:
737         myControlActor->SetControlMode(aFunctor,myScalarBarActor,myLookupTable);
738       }
739     }
740
741     if(theCheckEntityMode){
742       if(myControlActor == my1DActor)
743         SetEntityMode(eEdges);
744       else if(myControlActor == my2DActor){
745         switch(myControlMode){
746         case eLength2D:
747         case eFreeEdges:
748         case eMultiConnection2D:
749           //SetEntityMode(eEdges);
750           SetEntityMode(eFaces);
751           break;
752         default:
753           SetEntityMode(eFaces);
754         }
755       }else if(myControlActor == my3DActor)
756         SetEntityMode(eVolumes);
757     }
758
759   }else if(theCheckEntityMode){
760     myEntityMode = eAllEntity;
761   }
762
763   SetRepresentation(GetRepresentation());
764
765   myTimeStamp->Modified();
766   Modified();
767 }
768
769
770 void SMESH_ActorDef::AddToRender(vtkRenderer* theRenderer){
771   SALOME_Actor::AddToRender(theRenderer);
772
773   theRenderer->AddActor(myNodeActor);
774   theRenderer->AddActor(myBaseActor);
775
776   theRenderer->AddActor(my3DActor);
777   theRenderer->AddActor(my2DActor);
778
779   theRenderer->AddActor(my1DActor);
780   theRenderer->AddActor(my1DExtActor);
781
782   theRenderer->AddActor(myHighlitableActor);
783
784   theRenderer->AddActor2D(myScalarBarActor);
785
786   myPtsSelectVisiblePoints->SetRenderer(theRenderer);
787   myClsSelectVisiblePoints->SetRenderer(theRenderer);
788
789   theRenderer->AddActor2D(myPointLabels);
790   theRenderer->AddActor2D(myCellsLabels);
791 }
792
793 void SMESH_ActorDef::RemoveFromRender(vtkRenderer* theRenderer){
794   SALOME_Actor::RemoveFromRender(theRenderer);
795
796   theRenderer->RemoveActor(myNodeActor);
797   theRenderer->RemoveActor(myBaseActor);
798
799   theRenderer->RemoveActor(myHighlitableActor);
800
801   theRenderer->RemoveActor(my1DActor);
802   theRenderer->RemoveActor(my1DExtActor);
803
804   theRenderer->RemoveActor(my2DActor);
805   theRenderer->RemoveActor(my3DActor);
806
807   theRenderer->RemoveActor(myScalarBarActor);
808   theRenderer->RemoveActor(myPointLabels);
809   theRenderer->RemoveActor(myCellsLabels);
810 }
811
812
813 bool SMESH_ActorDef::Init(TVisualObjPtr theVisualObj, 
814                           const char* theEntry, 
815                           const char* theName,
816                           int theIsClear)
817 {
818   Handle(SALOME_InteractiveObject) anIO = new SALOME_InteractiveObject(theEntry,"SMESH",theName);
819   setIO(anIO);
820   setName(theName);
821
822   myVisualObj = theVisualObj;
823   myVisualObj->Update(theIsClear);
824
825   myNodeActor->Init(myVisualObj,myImplicitBoolean);
826   myBaseActor->Init(myVisualObj,myImplicitBoolean);
827   
828   myHighlitableActor->Init(myVisualObj,myImplicitBoolean);
829   
830   my1DActor->Init(myVisualObj,myImplicitBoolean);
831   my1DExtActor->Init(myVisualObj,myImplicitBoolean);
832   
833   my2DActor->Init(myVisualObj,myImplicitBoolean);
834   my3DActor->Init(myVisualObj,myImplicitBoolean);
835   
836   my1DActor->GetMapper()->SetLookupTable(myLookupTable);
837   my1DExtActor->GetMapper()->SetLookupTable(myLookupTable);
838
839   my2DActor->GetMapper()->SetLookupTable(myLookupTable);
840   my3DActor->GetMapper()->SetLookupTable(myLookupTable);
841     
842   float aFactor, aUnits;
843   my2DActor->GetPolygonOffsetParameters(aFactor,aUnits);
844   my2DActor->SetPolygonOffsetParameters(aFactor,aUnits*0.75);
845
846   //SetIsShrunkable(theGrid->GetNumberOfCells() > 10);
847   SetIsShrunkable(true);
848
849   SUIT_ResourceMgr* mgr = SUIT_Session::session()->resourceMgr();
850   if( !mgr )
851     return false;
852
853   QString aMode = mgr->stringValue( "DisplayMode", "SMESH" );
854   SetRepresentation(-1);
855   
856   if(aMode.compare("Wireframe") == 0){
857     SetRepresentation(eEdge);
858   }else if(aMode.compare("Shading") == 0){
859     SetRepresentation(eSurface);
860   }else if(aMode.compare("Nodes") == 0){
861     SetRepresentation(ePoint);
862   }
863   
864   aMode = mgr->stringValue( "Shrink", "SMESH" );
865   if(aMode == "yes"){
866     SetShrink();
867   }
868
869   myTimeStamp->Modified();
870   Modified();
871   return true;
872 }
873
874
875 float* SMESH_ActorDef::GetBounds(){
876   return myNodeActor->GetBounds();
877 }
878
879
880 vtkDataSet* SMESH_ActorDef::GetInput(){
881   return GetUnstructuredGrid();
882 }
883
884
885 void SMESH_ActorDef::SetTransform(VTKViewer_Transform* theTransform){
886   myNodeActor->SetTransform(theTransform);
887   myBaseActor->SetTransform(theTransform);
888
889   myHighlitableActor->SetTransform(theTransform);
890
891   my1DActor->SetTransform(theTransform);
892   my1DExtActor->SetTransform(theTransform);
893
894   my2DActor->SetTransform(theTransform);
895   my3DActor->SetTransform(theTransform);
896
897   Modified();
898 }
899
900
901 void SMESH_ActorDef::SetMapper(vtkMapper* theMapper){
902   vtkLODActor::SetMapper(theMapper);
903 }
904
905
906 void SMESH_ActorDef::ShallowCopy(vtkProp *prop){
907   SALOME_Actor::ShallowCopy(prop);
908 }
909
910
911 vtkMapper* SMESH_ActorDef::GetMapper(){
912   return myPickableActor->GetMapper();
913 }
914
915
916 vtkUnstructuredGrid* SMESH_ActorDef::GetUnstructuredGrid(){ 
917   return myVisualObj->GetUnstructuredGrid();
918 }
919
920
921 bool SMESH_ActorDef::IsInfinitive(){
922   vtkDataSet *aDataSet = myPickableActor->GetUnstructuredGrid();
923   aDataSet->Update();
924   myIsInfinite = aDataSet->GetNumberOfCells() == 0 ||
925     aDataSet->GetNumberOfCells() == 1 && 
926     aDataSet->GetCell(0)->GetCellType() == VTK_VERTEX;
927   return SALOME_Actor::IsInfinitive();
928 }
929
930
931 void SMESH_ActorDef::SetIsShrunkable(bool theShrunkable){
932   myIsShrinkable = theShrunkable;
933   Modified();
934 }
935
936 float SMESH_ActorDef::GetShrinkFactor(){
937   return myBaseActor->GetShrinkFactor();
938 }
939
940 void SMESH_ActorDef::SetShrinkFactor(float theValue){
941   myBaseActor->SetShrinkFactor(theValue);
942
943   my1DActor->SetShrinkFactor(theValue);
944   my1DExtActor->SetShrinkFactor(theValue);
945
946   my2DActor->SetShrinkFactor(theValue);
947   my3DActor->SetShrinkFactor(theValue);
948
949   Modified();
950 }
951
952 void SMESH_ActorDef::SetShrink(){
953   if(!myIsShrinkable) return;
954
955   myBaseActor->SetShrink();
956
957   my1DActor->SetShrink();
958   my1DExtActor->SetShrink();
959
960   my2DActor->SetShrink();
961   my3DActor->SetShrink();
962
963   myIsShrunk = true;
964   Modified();
965 }
966
967 void SMESH_ActorDef::UnShrink(){
968   if(!myIsShrunk) return;
969
970   myBaseActor->UnShrink();
971
972   my1DActor->UnShrink();
973   my1DExtActor->UnShrink();
974
975   my2DActor->UnShrink();
976   my3DActor->UnShrink();
977
978   myIsShrunk = false;
979   Modified();
980 }
981
982
983 int SMESH_ActorDef::GetNodeObjId(int theVtkID){
984   return myPickableActor->GetNodeObjId(theVtkID);
985 }
986
987 float* SMESH_ActorDef::GetNodeCoord(int theObjID){
988   return myPickableActor->GetNodeCoord(theObjID);
989 }
990
991
992 int SMESH_ActorDef::GetElemObjId(int theVtkID){
993   return myPickableActor->GetElemObjId(theVtkID);
994 }
995
996 vtkCell* SMESH_ActorDef::GetElemCell(int theObjID){
997   return myPickableActor->GetElemCell(theObjID);
998 }
999
1000
1001 void SMESH_ActorDef::SetVisibility(int theMode){
1002   SetVisibility(theMode,true);
1003 }
1004
1005
1006 void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation){
1007   SALOME_Actor::SetVisibility(theMode);
1008
1009   myNodeActor->VisibilityOff();
1010   myBaseActor->VisibilityOff();
1011   
1012   my1DActor->VisibilityOff();
1013   my1DExtActor->VisibilityOff();
1014   
1015   my2DActor->VisibilityOff();
1016   my3DActor->VisibilityOff();
1017   
1018   myScalarBarActor->VisibilityOff();
1019   myPointLabels->VisibilityOff();
1020   myCellsLabels->VisibilityOff();
1021   
1022   if(GetVisibility()){
1023     if(theIsUpdateRepersentation)
1024       SetRepresentation(GetRepresentation());
1025
1026     if(myControlMode != eNone){
1027       switch(myControlMode){
1028       case eFreeEdges:
1029       case eFreeBorders:
1030         my1DExtActor->VisibilityOn();
1031         break;
1032       case eLength2D:
1033       case eMultiConnection2D:
1034         my1DExtActor->VisibilityOn();
1035       default:
1036         if(myControlActor->GetUnstructuredGrid()->GetNumberOfCells())
1037           myScalarBarActor->VisibilityOn();
1038       }
1039     }
1040
1041     if(myRepresentation != ePoint)
1042       myPickableActor->VisibilityOn();
1043     else {
1044       myNodeActor->VisibilityOn();
1045     }
1046
1047     if(myEntityMode & eEdges){
1048       my1DActor->VisibilityOn();
1049     }
1050     
1051     if(myEntityMode & eFaces){
1052       my2DActor->VisibilityOn();
1053     }
1054     
1055     if(myEntityMode & eVolumes){
1056       my3DActor->VisibilityOn();
1057     }
1058     
1059     if(myIsPointsLabeled){ 
1060       myPointLabels->VisibilityOn();
1061       myNodeActor->VisibilityOn();
1062     }
1063
1064     if(myIsCellsLabeled) 
1065       myCellsLabels->VisibilityOn();
1066   }
1067
1068   Modified();
1069 }
1070
1071
1072 void SMESH_ActorDef::SetEntityMode(unsigned int theMode){
1073   myEntityState = eAllEntity;
1074
1075   if(!myVisualObj->GetNbEntities(SMDSAbs_Edge)){
1076     myEntityState &= ~eEdges;
1077     theMode &= ~eEdges;
1078   }
1079
1080   if(!myVisualObj->GetNbEntities(SMDSAbs_Face)){
1081     myEntityState &= ~eFaces;
1082     theMode &= ~eFaces;
1083   }
1084
1085   if(!myVisualObj->GetNbEntities(SMDSAbs_Volume)){
1086     myEntityState &= ~eVolumes;
1087     theMode &= ~eVolumes;
1088   }
1089
1090   if(!theMode){
1091     if(myVisualObj->GetNbEntities(SMDSAbs_Edge))
1092       theMode |= eEdges;
1093
1094     if(myVisualObj->GetNbEntities(SMDSAbs_Face))
1095       theMode |= eFaces;
1096
1097     if(myVisualObj->GetNbEntities(SMDSAbs_Volume))
1098       theMode |= eVolumes;
1099   }
1100
1101   myBaseActor->myGeomFilter->SetInside(myEntityMode != myEntityState);
1102
1103   myEntityMode = theMode;
1104   VTKViewer_ExtractUnstructuredGrid* aFilter = NULL;
1105   aFilter = myBaseActor->GetExtractUnstructuredGrid();
1106   aFilter->ClearRegisteredCellsWithType();
1107   aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding);
1108   
1109   if(myEntityMode & eEdges){
1110     if (MYDEBUG) MESSAGE("EDGES");
1111     aFilter->RegisterCellsWithType(VTK_LINE);
1112   }
1113
1114   if(myEntityMode & eFaces){
1115     if (MYDEBUG) MESSAGE("FACES");
1116     aFilter->RegisterCellsWithType(VTK_TRIANGLE);
1117     aFilter->RegisterCellsWithType(VTK_POLYGON);
1118     aFilter->RegisterCellsWithType(VTK_QUAD);
1119   }
1120
1121   if(myEntityMode & eVolumes){
1122     if (MYDEBUG) MESSAGE("VOLUMES");
1123     aFilter->RegisterCellsWithType(VTK_TETRA);
1124     aFilter->RegisterCellsWithType(VTK_VOXEL);
1125     aFilter->RegisterCellsWithType(VTK_HEXAHEDRON);
1126     aFilter->RegisterCellsWithType(VTK_WEDGE);
1127     aFilter->RegisterCellsWithType(VTK_PYRAMID);
1128     aFilter->RegisterCellsWithType(VTK_CONVEX_POINT_SET);
1129   }
1130   aFilter->Update();
1131   if (MYDEBUG) MESSAGE(aFilter->GetOutput()->GetNumberOfCells());
1132   SetVisibility(GetVisibility(),false);
1133 }
1134
1135 void SMESH_ActorDef::SetRepresentation(int theMode){ 
1136   int aNbEdges = myVisualObj->GetNbEntities(SMDSAbs_Edge);
1137   int aNbFaces = myVisualObj->GetNbEntities(SMDSAbs_Face);
1138   int aNbVolumes = myVisualObj->GetNbEntities(SMDSAbs_Volume);
1139   if(theMode < 0){
1140     myRepresentation = eSurface;
1141     if(!aNbFaces && !aNbVolumes && aNbEdges){
1142       myRepresentation = eEdge;
1143     }else if(!aNbFaces && !aNbVolumes && !aNbEdges){
1144       myRepresentation = ePoint;
1145     }
1146   }else{
1147     switch(theMode){
1148     case eEdge:
1149       if(!aNbFaces && !aNbVolumes && !aNbEdges) return;
1150       break;
1151     case eSurface:
1152       if(!aNbFaces && !aNbVolumes) return;
1153       break;
1154     }    
1155     myRepresentation = theMode;
1156   }
1157
1158   if(!GetUnstructuredGrid()->GetNumberOfCells())
1159     myRepresentation = ePoint;
1160
1161   if(myIsShrunk){
1162     if(myRepresentation == ePoint){
1163       UnShrink();
1164       myIsShrunk = true;
1165     }else{
1166       SetShrink();
1167     }      
1168   }
1169
1170   myPickableActor = myBaseActor;
1171   myNodeActor->SetVisibility(false);
1172   vtkProperty *aProp = NULL, *aBackProp = NULL;
1173   SMESH_DeviceActor::EReperesent aReperesent = SMESH_DeviceActor::EReperesent(-1);
1174   switch(myRepresentation){
1175   case ePoint:
1176     myPickableActor = myNodeActor;
1177     myNodeActor->SetVisibility(true);
1178     
1179     aProp = aBackProp = myNodeProp;
1180     aReperesent = SMESH_DeviceActor::ePoint;
1181     break;
1182   case eEdge:
1183     aProp = aBackProp = myEdgeProp;
1184     aReperesent = SMESH_DeviceActor::eInsideframe;
1185     break;
1186   case eSurface:
1187     aProp = mySurfaceProp;
1188     aBackProp = myBackSurfaceProp;
1189     aReperesent = SMESH_DeviceActor::eSurface;
1190     break;
1191   }    
1192
1193   my2DActor->SetProperty(aProp);
1194   my2DActor->SetBackfaceProperty(aBackProp);
1195   my2DActor->SetRepresentation(aReperesent);
1196   
1197   my3DActor->SetProperty(aProp);
1198   my3DActor->SetBackfaceProperty(aBackProp);
1199   my3DActor->SetRepresentation(aReperesent);
1200
1201   my1DExtActor->SetVisibility(false);
1202
1203   switch(myControlMode){
1204   case eLength:
1205   case eMultiConnection:
1206     aProp = aBackProp = my1DProp;
1207     if(myRepresentation != ePoint)
1208       aReperesent = SMESH_DeviceActor::eInsideframe;
1209     break;
1210   }
1211   
1212   my1DActor->SetProperty(aProp);
1213   my1DActor->SetBackfaceProperty(aBackProp);
1214   my1DActor->SetRepresentation(aReperesent);
1215
1216   my1DExtActor->SetRepresentation(aReperesent);
1217   
1218   if(myIsPointsVisible)
1219     myPickableActor = myNodeActor;
1220   if(GetPointRepresentation())
1221     myNodeActor->SetVisibility(true);
1222
1223   SetMapper(myPickableActor->GetMapper());
1224
1225   SetVisibility(GetVisibility(),false);
1226
1227   Modified();
1228 }
1229
1230
1231 void SMESH_ActorDef::SetPointRepresentation(bool theIsPointsVisible){
1232   myIsPointsVisible = theIsPointsVisible;
1233   SetRepresentation(GetRepresentation());
1234 }
1235
1236 bool SMESH_ActorDef::GetPointRepresentation(){ 
1237   return myIsPointsVisible || myIsPointsLabeled;
1238 }
1239
1240
1241 void SMESH_ActorDef::UpdateHighlight(){
1242   myHighlitableActor->SetVisibility(false);
1243   myHighlitableActor->SetHighlited(false);
1244
1245   if(myIsHighlighted){
1246     myHighlitableActor->SetProperty(myHighlightProp);
1247   }else if(myIsPreselected){
1248     myHighlitableActor->SetProperty(myPreselectProp);
1249   }
1250
1251   bool anIsVisible = GetVisibility();
1252
1253   if(myIsHighlighted || myIsPreselected){
1254     if(GetUnstructuredGrid()->GetNumberOfCells()){
1255       myHighlitableActor->SetHighlited(anIsVisible);
1256       myHighlitableActor->SetVisibility(anIsVisible);
1257       myHighlitableActor->GetExtractUnstructuredGrid()->
1258         SetModeOfExtraction(VTKViewer_ExtractUnstructuredGrid::eCells);
1259       myHighlitableActor->SetRepresentation(SMESH_DeviceActor::eWireframe);
1260     }else if(myRepresentation == ePoint || GetPointRepresentation()){
1261       myHighlitableActor->SetHighlited(anIsVisible);
1262       myHighlitableActor->SetVisibility(anIsVisible);
1263       myHighlitableActor->GetExtractUnstructuredGrid()->
1264         SetModeOfExtraction(VTKViewer_ExtractUnstructuredGrid::ePoints);
1265       myHighlitableActor->SetRepresentation(SMESH_DeviceActor::ePoint);
1266     }
1267   }
1268 }
1269
1270
1271 void SMESH_ActorDef::highlight(bool theHighlight){
1272   myIsHighlighted = theHighlight;
1273   UpdateHighlight();
1274 }
1275
1276
1277 void SMESH_ActorDef::SetPreSelected(bool thePreselect){ 
1278   myIsPreselected = thePreselect; 
1279   UpdateHighlight();
1280 }
1281
1282
1283 // From vtkFollower
1284 int SMESH_ActorDef::RenderOpaqueGeometry(vtkViewport *vp)
1285 {
1286   if (myPickableActor->GetIsOpaque())
1287     {
1288     vtkRenderer *ren = static_cast<vtkRenderer *>(vp);
1289     this->Render(ren);
1290     return 1;
1291     }
1292   return 0;
1293 }
1294
1295
1296 int SMESH_ActorDef::RenderTranslucentGeometry(vtkViewport *vp)
1297 {
1298   if (!myPickableActor->GetIsOpaque())
1299     {
1300     vtkRenderer *ren = static_cast<vtkRenderer *>(vp);
1301     this->Render(ren);
1302     return 1;
1303     }
1304   return 0;
1305 }
1306
1307
1308 void SMESH_ActorDef::Render(vtkRenderer *ren){
1309   unsigned long aTime = myTimeStamp->GetMTime();
1310   unsigned long anObjTime = myVisualObj->GetUnstructuredGrid()->GetMTime();
1311   unsigned long aClippingTime = myImplicitBoolean->GetMTime();
1312   if(anObjTime > aTime || aClippingTime > aTime)
1313     Update();
1314 }
1315
1316
1317 void SMESH_ActorDef::Update(){
1318   if(MYDEBUG) MESSAGE("SMESH_ActorDef::Update");
1319
1320   if(GetControlMode() != eNone) {
1321     unsigned long aTime = myTimeStamp->GetMTime();
1322     unsigned long anObjTime = myVisualObj->GetUnstructuredGrid()->GetMTime();
1323     if (anObjTime > aTime)
1324       SetControlMode(GetControlMode(),false);
1325   }
1326   if(myIsPointsLabeled){
1327     SetPointsLabeled(myIsPointsLabeled);
1328   }
1329   if(myIsCellsLabeled){
1330     SetCellsLabeled(myIsCellsLabeled);
1331   }
1332   SetEntityMode(GetEntityMode());
1333   SetVisibility(GetVisibility());
1334   
1335   myTimeStamp->Modified();
1336   Modified();
1337 }
1338
1339
1340 void SMESH_ActorDef::ReleaseGraphicsResources(vtkWindow *renWin){
1341   SALOME_Actor::ReleaseGraphicsResources(renWin);
1342
1343   myPickableActor->ReleaseGraphicsResources(renWin);
1344 }
1345
1346
1347 static void GetColor(vtkProperty *theProperty, float& r,float& g,float& b){
1348   float* aColor = theProperty->GetColor();
1349   r = aColor[0];
1350   g = aColor[1];
1351   b = aColor[2];
1352 }
1353
1354
1355 void SMESH_ActorDef::SetOpacity(float theValue){
1356   mySurfaceProp->SetOpacity(theValue);
1357   myBackSurfaceProp->SetOpacity(theValue);
1358   myEdgeProp->SetOpacity(theValue);
1359   myNodeProp->SetOpacity(theValue);
1360
1361   my1DProp->SetOpacity(theValue);
1362 }
1363
1364
1365 float SMESH_ActorDef::GetOpacity(){
1366   return mySurfaceProp->GetOpacity();
1367 }
1368
1369
1370 void SMESH_ActorDef::SetSufaceColor(float r,float g,float b){
1371   mySurfaceProp->SetColor(r,g,b);
1372   Modified();
1373 }
1374
1375 void SMESH_ActorDef::GetSufaceColor(float& r,float& g,float& b){
1376   ::GetColor(mySurfaceProp,r,g,b);
1377 }
1378
1379 void SMESH_ActorDef::SetBackSufaceColor(float r,float g,float b){
1380   myBackSurfaceProp->SetColor(r,g,b);
1381   Modified();
1382 }
1383
1384 void SMESH_ActorDef::GetBackSufaceColor(float& r,float& g,float& b){
1385   ::GetColor(myBackSurfaceProp,r,g,b);
1386 }
1387
1388 void SMESH_ActorDef::SetEdgeColor(float r,float g,float b){
1389   myEdgeProp->SetColor(r,g,b);
1390   my1DProp->SetColor(r,g,b);
1391   my1DExtProp->SetColor(1.0-r,1.0-g,1.0-b);
1392   Modified();
1393 }
1394
1395 void SMESH_ActorDef::GetEdgeColor(float& r,float& g,float& b){
1396   ::GetColor(myEdgeProp,r,g,b);
1397 }
1398
1399 void SMESH_ActorDef::SetNodeColor(float r,float g,float b){ 
1400   myNodeProp->SetColor(r,g,b);
1401   Modified();
1402 }
1403
1404 void SMESH_ActorDef::GetNodeColor(float& r,float& g,float& b){ 
1405   ::GetColor(myNodeProp,r,g,b);
1406 }
1407
1408 void SMESH_ActorDef::SetHighlightColor(float r,float g,float b){ 
1409   myHighlightProp->SetColor(r,g,b);
1410   Modified();
1411 }
1412
1413 void SMESH_ActorDef::GetHighlightColor(float& r,float& g,float& b){ 
1414   ::GetColor(myHighlightProp,r,g,b);
1415 }
1416
1417 void SMESH_ActorDef::SetPreHighlightColor(float r,float g,float b){ 
1418   myPreselectProp->SetColor(r,g,b);
1419   Modified();
1420 }
1421
1422 void SMESH_ActorDef::GetPreHighlightColor(float& r,float& g,float& b){ 
1423   ::GetColor(myPreselectProp,r,g,b);
1424 }
1425
1426
1427 float SMESH_ActorDef::GetLineWidth(){
1428   return myEdgeProp->GetLineWidth();
1429 }
1430
1431
1432 void SMESH_ActorDef::SetLineWidth(float theVal){
1433   myEdgeProp->SetLineWidth(theVal);
1434
1435   my1DProp->SetLineWidth(theVal + aLineWidthInc);
1436   my1DExtProp->SetLineWidth(theVal + aLineWidthInc);
1437
1438   Modified();
1439 }
1440
1441
1442 void SMESH_ActorDef::SetNodeSize(float theVal){
1443   myNodeProp->SetPointSize(theVal);
1444   myHighlightProp->SetPointSize(theVal);
1445   myPreselectProp->SetPointSize(theVal);
1446
1447   my1DProp->SetPointSize(theVal + aPointSizeInc);
1448   my1DExtProp->SetPointSize(theVal + aPointSizeInc);
1449
1450   Modified();
1451 }
1452
1453 float SMESH_ActorDef::GetNodeSize(){
1454   return myNodeProp->GetPointSize();
1455 }
1456
1457 int SMESH_ActorDef::GetObjDimension( const int theObjId )
1458 {
1459   return myVisualObj->GetElemDimension( theObjId );
1460 }
1461
1462 bool
1463 SMESH_ActorDef::
1464 IsImplicitFunctionUsed() const
1465 {
1466   return myBaseActor->IsImplicitFunctionUsed();
1467 }
1468
1469 void
1470 SMESH_ActorDef::
1471 SetImplicitFunctionUsed(bool theIsImplicitFunctionUsed)
1472 {
1473   myNodeActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed);
1474   myBaseActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed);
1475   
1476   myHighlitableActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed);
1477   
1478   my1DActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed);
1479   my1DExtActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed);
1480   
1481   my2DActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed);
1482   my3DActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed);
1483 }
1484
1485 vtkIdType 
1486 SMESH_ActorDef::
1487 AddClippingPlane(vtkPlane* thePlane)
1488 {
1489   if(thePlane){
1490     myImplicitBoolean->GetFunction()->AddItem(thePlane);
1491     myCippingPlaneCont.push_back(thePlane);
1492     if(!IsImplicitFunctionUsed())
1493       SetImplicitFunctionUsed(true);
1494   }
1495   return myCippingPlaneCont.size();
1496 }
1497
1498 void
1499 SMESH_ActorDef::
1500 RemoveAllClippingPlanes()
1501 {
1502   myImplicitBoolean->GetFunction()->RemoveAllItems();
1503   myImplicitBoolean->GetFunction()->Modified(); // VTK bug
1504   myCippingPlaneCont.clear();
1505   SetImplicitFunctionUsed(false);
1506 }
1507
1508 vtkIdType
1509 SMESH_ActorDef::
1510 GetNumberOfClippingPlanes()
1511 {
1512   return myCippingPlaneCont.size();
1513 }
1514
1515 vtkPlane* 
1516 SMESH_ActorDef::
1517 GetClippingPlane(vtkIdType theID)
1518 {
1519   if(theID >= myCippingPlaneCont.size())
1520     return NULL;
1521   return myCippingPlaneCont[theID].Get();
1522 }
1523
1524
1525 static void ComputeBoundsParam(vtkDataSet* theDataSet,
1526                                float theDirection[3], float theMinPnt[3],
1527                                float& theMaxBoundPrj, float& theMinBoundPrj)
1528 {
1529   float aBounds[6];
1530   theDataSet->GetBounds(aBounds);
1531
1532   //Enlarge bounds in order to avoid conflicts of precision
1533   for(int i = 0; i < 6; i += 2){
1534     static double EPS = 1.0E-3;
1535     float aDelta = (aBounds[i+1] - aBounds[i])*EPS;
1536     aBounds[i] -= aDelta;
1537     aBounds[i+1] += aDelta;
1538   }
1539
1540   float aBoundPoints[8][3] = { {aBounds[0],aBounds[2],aBounds[4]},
1541                                {aBounds[1],aBounds[2],aBounds[4]},
1542                                {aBounds[0],aBounds[3],aBounds[4]},
1543                                {aBounds[1],aBounds[3],aBounds[4]},
1544                                {aBounds[0],aBounds[2],aBounds[5]},
1545                                {aBounds[1],aBounds[2],aBounds[5]}, 
1546                                {aBounds[0],aBounds[3],aBounds[5]}, 
1547                                {aBounds[1],aBounds[3],aBounds[5]}};
1548
1549   int aMaxId = 0, aMinId = aMaxId;
1550   theMaxBoundPrj = vtkMath::Dot(theDirection,aBoundPoints[aMaxId]);
1551   theMinBoundPrj = theMaxBoundPrj;
1552   for(int i = 1; i < 8; i++){
1553     float aTmp = vtkMath::Dot(theDirection,aBoundPoints[i]);
1554     if(theMaxBoundPrj < aTmp){
1555       theMaxBoundPrj = aTmp;
1556       aMaxId = i;
1557     }
1558     if(theMinBoundPrj > aTmp){
1559       theMinBoundPrj = aTmp;
1560       aMinId = i;
1561     }
1562   }
1563   float *aMinPnt = aBoundPoints[aMaxId];
1564   theMinPnt[0] = aMinPnt[0];
1565   theMinPnt[1] = aMinPnt[1];
1566   theMinPnt[2] = aMinPnt[2];
1567 }
1568
1569
1570 static void DistanceToPosition(vtkDataSet* theDataSet,
1571                                float theDirection[3], float theDist, float thePos[3])
1572 {
1573   float aMaxBoundPrj, aMinBoundPrj, aMinPnt[3];
1574   ComputeBoundsParam(theDataSet,theDirection,aMinPnt,aMaxBoundPrj,aMinBoundPrj);
1575   float aLength = (aMaxBoundPrj-aMinBoundPrj)*theDist;
1576   thePos[0] = aMinPnt[0]-theDirection[0]*aLength;
1577   thePos[1] = aMinPnt[1]-theDirection[1]*aLength;
1578   thePos[2] = aMinPnt[2]-theDirection[2]*aLength;
1579 }
1580
1581
1582 static void PositionToDistance(vtkDataSet* theDataSet, 
1583                                float theDirection[3], float thePos[3], float& theDist)
1584 {
1585   float aMaxBoundPrj, aMinBoundPrj, aMinPnt[3];
1586   ComputeBoundsParam(theDataSet,theDirection,aMinPnt,aMaxBoundPrj,aMinBoundPrj);
1587   float aPrj = vtkMath::Dot(theDirection,thePos);
1588   theDist = (aPrj-aMinBoundPrj)/(aMaxBoundPrj-aMinBoundPrj);
1589 }
1590
1591
1592 void SMESH_ActorDef::SetPlaneParam(float theDir[3], float theDist, vtkPlane* thePlane)
1593 {
1594   thePlane->SetNormal(theDir);
1595   float anOrigin[3];
1596   ::DistanceToPosition(GetUnstructuredGrid(),theDir,theDist,anOrigin);
1597   thePlane->SetOrigin(anOrigin);
1598 }
1599
1600
1601 void SMESH_ActorDef::GetPlaneParam(float theDir[3], float& theDist, vtkPlane* thePlane)
1602 {
1603   thePlane->GetNormal(theDir);
1604
1605   float anOrigin[3];
1606   thePlane->GetOrigin(anOrigin);
1607   ::PositionToDistance(GetUnstructuredGrid(),theDir,anOrigin,theDist);
1608 }