Salome HOME
Merge remote branch 'origin/V8_5_asterstudy'
[modules/smesh.git] / src / OBJECT / SMESH_Actor.cxx
index ada5f91b8ae2f1294fc7c0ce9475546573656549..23dee68601b29a83e4662531fdd0554d0d6258fa 100644 (file)
@@ -28,6 +28,7 @@
 #include "SMESH_ActorDef.h"
 
 #include "SMDS_UnstructuredGrid.hxx"
+#include "SMESH_ActorProps.h"
 #include "SMESH_ActorUtils.h"
 #include "SMESH_CellLabelActor.h"
 #include "SMESH_ControlsDef.hxx"
@@ -87,9 +88,6 @@ static int MYDEBUG = 0;
 static int MYDEBUG = 0;
 #endif
 
-static int aLineWidthInc = 2;
-
-
 SMESH_ActorDef* SMESH_ActorDef::New(){
   return new SMESH_ActorDef();
 }
@@ -126,6 +124,7 @@ SMESH_ActorDef::SMESH_ActorDef()
 
   myIsPointsVisible = false;
   myIsEntityModeCache = false;
+  myRepresentationCache = 0;
 
   myHighlightActor = SMESH_SVTKActor::New();
   myHighlightActor->Delete(); // vtkSmartPointer!
@@ -140,6 +139,9 @@ SMESH_ActorDef::SMESH_ActorDef()
 
   myIsFacesOriented = false;
 
+  int controlsIncrement = SMESH_ActorProps::props()->controlsIncrement();
+  int selectionIncrement = SMESH_ActorProps::props()->selectionIncrement();
+
   myControlsPrecision = -1;
   SUIT_ResourceMgr* mgr = SUIT_Session::session()->resourceMgr();
 
@@ -239,6 +241,7 @@ SMESH_ActorDef::SMESH_ActorDef()
   anRGB[0] = 1 - anRGB[0];
   anRGB[1] = 1 - anRGB[1];
   anRGB[2] = 1 - anRGB[2];
+  my2DExtProp->SetLineWidth(aLineWidth + controlsIncrement);
   my2DExtProp->SetColor(anRGB[0],anRGB[1],anRGB[2]);
 
   my2DExtActor = SMESH_DeviceActor::New();
@@ -278,6 +281,7 @@ SMESH_ActorDef::SMESH_ActorDef()
   aFilter->RegisterCellsWithType(VTK_QUADRATIC_HEXAHEDRON);
   aFilter->RegisterCellsWithType(VTK_TRIQUADRATIC_HEXAHEDRON);
   aFilter->RegisterCellsWithType(VTK_QUADRATIC_WEDGE);
+  aFilter->RegisterCellsWithType(VTK_BIQUADRATIC_QUADRATIC_WEDGE);
   aFilter->RegisterCellsWithType(VTK_QUADRATIC_PYRAMID);
   aFilter->RegisterCellsWithType(VTK_CONVEX_POINT_SET);
   aFilter->RegisterCellsWithType(VTK_POLYHEDRON);
@@ -288,6 +292,7 @@ SMESH_ActorDef::SMESH_ActorDef()
   anRGB[0] = 1 - anRGB[0];
   anRGB[1] = 1 - anRGB[1];
   anRGB[2] = 1 - anRGB[2];
+  my3DExtProp->SetLineWidth(aLineWidth + controlsIncrement);
   my3DExtProp->SetColor(anRGB[0],anRGB[1],anRGB[2]);
 
   my3DExtActor = SMESH_DeviceActor::New();
@@ -309,6 +314,7 @@ SMESH_ActorDef::SMESH_ActorDef()
   aFilter->RegisterCellsWithType(VTK_QUADRATIC_HEXAHEDRON);
   aFilter->RegisterCellsWithType(VTK_TRIQUADRATIC_HEXAHEDRON);
   aFilter->RegisterCellsWithType(VTK_QUADRATIC_WEDGE);
+  aFilter->RegisterCellsWithType(VTK_BIQUADRATIC_QUADRATIC_WEDGE);
   aFilter->RegisterCellsWithType(VTK_QUADRATIC_PYRAMID);
   aFilter->RegisterCellsWithType(VTK_CONVEX_POINT_SET);
   aFilter->RegisterCellsWithType(VTK_POLYHEDRON);
@@ -323,6 +329,10 @@ SMESH_ActorDef::SMESH_ActorDef()
   myEdgeProp->SetColor(anRGB[0],anRGB[1],anRGB[2]);
   myEdgeProp->SetLineWidth(aLineWidth);
 
+  // my1DActor is used to
+  // - show numbers
+  // - show controls on all edges (eg Length)
+  // since edges are shown by myHighlitableActor
   my1DActor = SMESH_CellLabelActor::New();
   my1DActor->SetStoreClippingMapping(true);
   my1DActor->SetUserMatrix(aMatrix);
@@ -338,7 +348,7 @@ SMESH_ActorDef::SMESH_ActorDef()
 
   my1DProp = vtkProperty::New();
   my1DProp->DeepCopy(myEdgeProp);
-  my1DProp->SetLineWidth(aLineWidth + aLineWidthInc);
+  my1DProp->SetLineWidth(aLineWidth + controlsIncrement);
   my1DProp->SetPointSize(aElem0DSize);
 
   my1DExtProp = vtkProperty::New();
@@ -347,9 +357,10 @@ SMESH_ActorDef::SMESH_ActorDef()
   anRGB[1] = 1 - anRGB[1];
   anRGB[2] = 1 - anRGB[2];
   my1DExtProp->SetColor(anRGB[0],anRGB[1],anRGB[2]);
-  my1DExtProp->SetLineWidth(aLineWidth + aLineWidthInc);
+  my1DExtProp->SetLineWidth(aLineWidth + controlsIncrement);
   my1DExtProp->SetPointSize(aElem0DSize);
 
+  // my1DExtActor is used to show filtered edges or links between nodes
   my1DExtActor = SMESH_DeviceActor::New();
   my1DExtActor->SetUserMatrix(aMatrix);
   my1DExtActor->PickableOff();
@@ -477,7 +488,7 @@ SMESH_ActorDef::SMESH_ActorDef()
   SMESH::GetColor( "SMESH", "selection_object_color", anRGB[0], anRGB[1], anRGB[2], QColor( 255, 255, 255 ) );
   myHighlightProp->SetColor(anRGB[0],anRGB[1],anRGB[2]);
   myHighlightProp->SetPointSize(aElem0DSize); // ??
-  myHighlightProp->SetLineWidth(aLineWidth);
+  myHighlightProp->SetLineWidth(aLineWidth + selectionIncrement);
   myHighlightProp->SetRepresentation(1);
 
   myOutLineProp = vtkProperty::New();
@@ -496,7 +507,7 @@ SMESH_ActorDef::SMESH_ActorDef()
   SMESH::GetColor( "SMESH", "highlight_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 255, 255 ) );
   myPreselectProp->SetColor(anRGB[0],anRGB[1],anRGB[2]);
   myPreselectProp->SetPointSize(aElem0DSize); // ??
-  myPreselectProp->SetLineWidth(aLineWidth);
+  myPreselectProp->SetLineWidth(aLineWidth + selectionIncrement);
   myPreselectProp->SetRepresentation(1);
 
   myHighlitableActor = SMESH_DeviceActor::New();
@@ -796,12 +807,20 @@ bool SMESH_ActorDef::GetFacesOrientation3DVectors()
 }
 
 
+void SMESH_ActorDef::SetControl(SMESH::Controls::FunctorPtr theFunctor)
+{
+  myFunctor = theFunctor;
+  if ( !theFunctor )
+    SetControlMode( eNone, true );
+  else
+    SetControlMode( eCustomControl, true );
+}
+
 void SMESH_ActorDef::SetControlMode(eControl theMode)
 {
   SetControlMode(theMode,true);
 }
 
-
 void SMESH_ActorDef::SetControlMode( eControl theMode, bool theCheckEntityMode )
 {
   vtkLookupTable* lookupTable = static_cast<vtkLookupTable*>(myScalarBarActor->GetLookupTable());
@@ -812,7 +831,8 @@ void SMESH_ActorDef::SetControlMode( eControl theMode, bool theCheckEntityMode )
   if( !mgr )
     return;
 
-  myControlMode = eNone;
+  //myControlMode = eNone;
+  myControlMode = theMode;
   theCheckEntityMode &= mgr->booleanValue( "SMESH", "display_entity", false );
 
   my0DActor->GetMapper()->SetScalarVisibility(false);
@@ -835,11 +855,9 @@ void SMESH_ActorDef::SetControlMode( eControl theMode, bool theCheckEntityMode )
       break;
     }
     case eLength2D:
-    {
       myFunctor.reset(new SMESH::Controls::Length2D());
       myControlActor = my2DActor;
       break;
-    }
     case eFreeBorders:
       myFunctor.reset(new SMESH::Controls::FreeBorders());
       myControlActor = my1DActor;
@@ -949,6 +967,14 @@ void SMESH_ActorDef::SetControlMode( eControl theMode, bool theCheckEntityMode )
       myControlActor = my3DActor;
       break;
     }
+    case eDeflection2D:
+    {
+      SMESH::Controls::Deflection2D* aControl = new SMESH::Controls::Deflection2D();
+      aControl->SetPrecision( myControlsPrecision );
+      myFunctor.reset( aControl );
+      myControlActor = my2DActor;
+      break;
+    }
     case eBareBorderVolume:
     {
       myFunctor.reset(new SMESH::Controls::BareBorderVolume());
@@ -991,15 +1017,27 @@ void SMESH_ActorDef::SetControlMode( eControl theMode, bool theCheckEntityMode )
       myControlActor = myNodeActor;
       break;
     }
+    case eCustomControl:
+    {
+      if ( !myFunctor )
+        return;
+      switch ( myFunctor->GetType() ) {
+      case SMDSAbs_Node          : myControlActor = myNodeActor; break;
+      case SMDSAbs_Edge          : myControlActor = my1DActor;   break;
+      case SMDSAbs_Face          : myControlActor = my2DActor;   break;
+      case SMDSAbs_Volume        : myControlActor = my3DActor;   break;
+      default                    : return;
+      }
+      break;
+    }
     default:
       return;
     }
 
-    vtkUnstructuredGrid* aGrid = myControlActor->GetUnstructuredGrid();
-    vtkIdType aNbCells = aGrid->GetNumberOfCells();
+    int aNbCells = myFunctor ? myVisualObj->GetNbEntities( myFunctor->GetType() ) : 0;
     bool aShowOnlyScalarBarTitle = false;
     if(aNbCells) {
-      myControlMode = theMode;
+      //myControlMode = theMode;
       switch(myControlMode){
       case eFreeNodes:
       case eCoincidentNodes:
@@ -1055,25 +1093,13 @@ void SMESH_ActorDef::SetControlMode( eControl theMode, bool theCheckEntityMode )
         SetEntityMode(eEdges);
       }
       else if(myControlActor == my2DActor) {
-        switch(myControlMode) {
-        case eLength2D:
-        case eFreeEdges:
-        case eFreeFaces:
-        case eMultiConnection2D:
-          if (!myIsEntityModeCache){
-            myEntityModeCache = GetEntityMode();
-            myIsEntityModeCache=true;
-          }
-          SetEntityMode(eFaces);
-          break;
-        default:
-          if (!myIsEntityModeCache){
-            myEntityModeCache = GetEntityMode();
-            myIsEntityModeCache=true;
-          }
-          SetEntityMode(eFaces);
+        if (!myIsEntityModeCache){
+          myEntityModeCache = GetEntityMode();
+          myIsEntityModeCache=true;
         }
-      }else if(myControlActor == my3DActor) {
+        SetEntityMode(eFaces);
+      }
+      else if(myControlActor == my3DActor) {
         if (!myIsEntityModeCache){
             myEntityModeCache = GetEntityMode();
             myIsEntityModeCache=true;
@@ -1083,7 +1109,7 @@ void SMESH_ActorDef::SetControlMode( eControl theMode, bool theCheckEntityMode )
     }
     QString aTitle = QString(myScalarBarActor->GetTitle());
     aTitle.replace(QRegExp("(:\\s).*"),"\\1"+ QString::number(GetNumberControlEntities()));
-    myScalarBarActor->SetTitle(aTitle.toLatin1().constData());
+    myScalarBarActor->SetTitle(aTitle.toUtf8().constData());
 
   }
   else {
@@ -1105,7 +1131,7 @@ void SMESH_ActorDef::SetControlMode( eControl theMode, bool theCheckEntityMode )
   if (isLogarithmic && range[0] > 1e-07 && range[1] > 1e-07)
     lookupTable->SetScale(VTK_SCALE_LOG10);
 
-  Update();
+  //Update();
 }
 
 int SMESH_ActorDef::GetNumberControlEntities()
@@ -1142,7 +1168,7 @@ void SMESH_ActorDef::AddToRender(vtkRenderer* theRenderer)
   if ( !mySelector || !mySelector->IsSelectionEnabled() )
   {
     myBaseActor->SetUnstructuredGrid( NULL );
-    myHighlitableActor->SetUnstructuredGrid( NULL );
+    //myHighlitableActor->SetUnstructuredGrid( NULL );
   }
   theRenderer->AddActor(myBaseActor);
   theRenderer->AddActor(myNodeExtActor);
@@ -1436,6 +1462,10 @@ double* SMESH_ActorDef::GetNodeCoord(int theObjID)
   return myPickableActor->GetNodeCoord(theObjID);
 }
 
+int SMESH_ActorDef::GetNodeVtkId(int theObjID)
+{
+  return myPickableActor->GetNodeVtkId(theObjID);
+}
 
 int SMESH_ActorDef::GetElemObjId(int theVtkID)
 {
@@ -1477,8 +1507,8 @@ void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation)
 
   myScalarBarActor->VisibilityOff();
 
-  if(GetVisibility()){
-    if(theIsUpdateRepersentation)
+  if ( GetVisibility() ) {
+    if ( theIsUpdateRepersentation )
       SetRepresentation(GetRepresentation());
 
     if(myControlMode != eNone) {
@@ -1487,9 +1517,15 @@ void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation)
       case eCoincidentNodes:
         myNodeExtActor->VisibilityOn();
         break;
+      case eLength:
+      case eMultiConnection:
+        my1DActor->VisibilityOn();
+        break;
       case eFreeEdges:
       case eFreeBorders:
       case eCoincidentElems1D:
+      case eLength2D:
+      case eMultiConnection2D:
         my1DExtActor->VisibilityOn();
         break;
       case eFreeFaces:
@@ -1503,45 +1539,37 @@ void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation)
       case eCoincidentElems3D:
         my3DExtActor->VisibilityOn();
         break;
-      case eLength2D:
-      case eMultiConnection2D:
-        my1DExtActor->VisibilityOn();
-        break;
       default:;
       }
-      if(myControlActor->GetUnstructuredGrid()->GetNumberOfCells())
+      if ( myFunctor && myVisualObj->GetNbEntities( myFunctor->GetType() ))
         myScalarBarActor->VisibilityOn();
     }
 
-    if(myRepresentation != ePoint)
-      myPickableActor->VisibilityOn();
-    else {
-      myNodeActor->VisibilityOn();
-    }
-
-    if(myEntityMode & e0DElements && GetRepresentation() != ePoint ){
-      my0DActor->VisibilityOn();
-    }
-    if(myEntityMode & eBallElem && GetRepresentation() != ePoint ){
-      myBallActor->VisibilityOn();
-    }
-
-    if(myEntityMode & eEdges && GetRepresentation() != ePoint){
-      my1DActor->VisibilityOn();
-    }
-
-    if(myEntityMode & eFaces && GetRepresentation() != ePoint){
-      my2DActor->VisibilityOn();
-    }
+    myPickableActor->VisibilityOn();
 
-    if(myEntityMode & eVolumes && GetRepresentation() != ePoint){
-      my3DActor->VisibilityOn();
+    if ( GetRepresentation() != ePoint )
+    {
+      if(myEntityMode & e0DElements  ){
+        my0DActor->VisibilityOn();
+      }
+      if(myEntityMode & eBallElem    ){
+        myBallActor->VisibilityOn();
+      }
+      if(myEntityMode & eEdges && GetCellsLabeled() ){ // my1DActor shows labels only
+        my1DActor->VisibilityOn();
+      }
+      if(myEntityMode & eFaces      ){
+        my2DActor->VisibilityOn();
+      }
+      if(myEntityMode & eVolumes    ){
+        my3DActor->VisibilityOn();
+      }
     }
 
-    if(myNodeActor->GetPointsLabeled()){
+    if(myNodeActor->GetPointsLabeled()) {
+      myNodeActor->UpdateLabels();
       myNodeActor->VisibilityOn();
     }
-
     if(my0DActor)
       my0DActor->UpdateLabels();
 
@@ -1568,30 +1596,30 @@ void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation)
 
 void SMESH_ActorDef::SetEntityMode(unsigned int theMode)
 {
-  myEntityState = eAllEntity;
+  unsigned int anObjectEntities = eAllEntity; // entities present in my object
 
   if(!myVisualObj->GetNbEntities(SMDSAbs_0DElement)) {
-    myEntityState &= ~e0DElements;
+    anObjectEntities &= ~e0DElements;
     theMode &= ~e0DElements;
   }
 
   if(!myVisualObj->GetNbEntities(SMDSAbs_Ball)) {
-    myEntityState &= ~eBallElem;
+    anObjectEntities &= ~eBallElem;
     theMode &= ~eBallElem;
   }
 
   if(!myVisualObj->GetNbEntities(SMDSAbs_Edge)) {
-    myEntityState &= ~eEdges;
+    anObjectEntities &= ~eEdges;
     theMode &= ~eEdges;
   }
 
   if(!myVisualObj->GetNbEntities(SMDSAbs_Face)) {
-    myEntityState &= ~eFaces;
+    anObjectEntities &= ~eFaces;
     theMode &= ~eFaces;
   }
 
   if(!myVisualObj->GetNbEntities(SMDSAbs_Volume)) {
-    myEntityState &= ~eVolumes;
+    anObjectEntities &= ~eVolumes;
     theMode &= ~eVolumes;
   }
 
@@ -1612,102 +1640,111 @@ void SMESH_ActorDef::SetEntityMode(unsigned int theMode)
       theMode |= eVolumes;
   }
 
-  myBaseActor->myGeomFilter->SetInside(myEntityMode != myEntityState);
+  myBaseActor->myGeomFilter->SetInside(myEntityMode != anObjectEntities);
 
-  myEntityMode = theMode;
-
-  VTKViewer_ExtractUnstructuredGrid* aFilter = myBaseActor->GetExtractUnstructuredGrid();
-  aFilter->ClearRegisteredCellsWithType();
-  VTKViewer_ExtractUnstructuredGrid* aHightFilter = myHighlitableActor->GetExtractUnstructuredGrid();
-  aHightFilter->ClearRegisteredCellsWithType();
-
-  bool isPassAll =
-    (( myEntityMode & e0DElements || myVisualObj->GetNbEntities(SMDSAbs_0DElement) == 0 ) &&
-     ( myEntityMode & eBallElem   || myVisualObj->GetNbEntities(SMDSAbs_Ball)      == 0 ) &&
-     ( myEntityMode & eEdges      || myVisualObj->GetNbEntities(SMDSAbs_Edge)      == 0 ) &&
-     ( myEntityMode & eFaces      || myVisualObj->GetNbEntities(SMDSAbs_Face)      == 0 ) &&
-     ( myEntityMode & eVolumes    || myVisualObj->GetNbEntities(SMDSAbs_Volume)    == 0 ));
-  if ( isPassAll && myEntityMode )
+  if ( anObjectEntities == 0 && myRepresentation != ePoint ) // no elements, show nodes
   {
-    aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::ePassAll);
-    aHightFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::ePassAll);
+    myRepresentationCache = GetRepresentation();
+    SetRepresentation( ePoint );
   }
-  else
+
+  if ( myEntityMode != theMode )
   {
-    aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding);
-    aHightFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding);
+    myEntityMode = theMode; // entities to show
 
-    if (myEntityMode & e0DElements) {
-      aFilter->RegisterCellsWithType(VTK_VERTEX);
-      aHightFilter->RegisterCellsWithType(VTK_VERTEX);
-    }
+    // Set cell types to extract
+
+    VTKViewer_ExtractUnstructuredGrid*    aFilter = myBaseActor->GetExtractUnstructuredGrid();
+    VTKViewer_ExtractUnstructuredGrid* aHltFilter = myHighlitableActor->GetExtractUnstructuredGrid();
+    aFilter->ClearRegisteredCellsWithType();
+    aHltFilter->ClearRegisteredCellsWithType();
 
-    if (myEntityMode & eBallElem) {
-      aFilter->RegisterCellsWithType(VTK_POLY_VERTEX);
+    bool isPassAll = ( myEntityMode == anObjectEntities && myEntityMode );
+    if ( isPassAll )
+    {
+      aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::ePassAll);
+      aHltFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::ePassAll);
     }
+    else
+    {
+      aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding);
+      aHltFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding);
 
-    if (myEntityMode & eEdges) {
-      aFilter->RegisterCellsWithType(VTK_LINE);
-      aFilter->RegisterCellsWithType(VTK_QUADRATIC_EDGE);
+      if (myEntityMode & e0DElements) {
+        aFilter->RegisterCellsWithType(VTK_VERTEX);
+        aHltFilter->RegisterCellsWithType(VTK_VERTEX);
+      }
 
-      aHightFilter->RegisterCellsWithType(VTK_LINE);
-      aHightFilter->RegisterCellsWithType(VTK_QUADRATIC_EDGE);
-    }
+      if (myEntityMode & eBallElem) {
+        aFilter->RegisterCellsWithType(VTK_POLY_VERTEX);
+      }
 
-    if (myEntityMode & eFaces) {
-      aFilter->RegisterCellsWithType(VTK_TRIANGLE);
-      aFilter->RegisterCellsWithType(VTK_QUAD);
-      aFilter->RegisterCellsWithType(VTK_POLYGON);
-      aFilter->RegisterCellsWithType(VTK_QUADRATIC_TRIANGLE);
-      aFilter->RegisterCellsWithType(VTK_QUADRATIC_QUAD);
-      aFilter->RegisterCellsWithType(VTK_QUADRATIC_POLYGON);
-      aFilter->RegisterCellsWithType(VTK_BIQUADRATIC_QUAD);
-      aFilter->RegisterCellsWithType(VTK_BIQUADRATIC_TRIANGLE);
-
-      aHightFilter->RegisterCellsWithType(VTK_TRIANGLE);
-      aHightFilter->RegisterCellsWithType(VTK_QUAD);
-      aHightFilter->RegisterCellsWithType(VTK_POLYGON);
-      aHightFilter->RegisterCellsWithType(VTK_QUADRATIC_TRIANGLE);
-      aHightFilter->RegisterCellsWithType(VTK_QUADRATIC_QUAD);
-      aHightFilter->RegisterCellsWithType(VTK_QUADRATIC_POLYGON);
-      aHightFilter->RegisterCellsWithType(VTK_BIQUADRATIC_QUAD);
-      aHightFilter->RegisterCellsWithType(VTK_BIQUADRATIC_TRIANGLE);
-    }
+      if (myEntityMode & eEdges) {
+        aFilter->RegisterCellsWithType(VTK_LINE);
+        aFilter->RegisterCellsWithType(VTK_QUADRATIC_EDGE);
+
+        aHltFilter->RegisterCellsWithType(VTK_LINE);
+        aHltFilter->RegisterCellsWithType(VTK_QUADRATIC_EDGE);
+      }
 
-    if (myEntityMode & eVolumes) {
-      aFilter->RegisterCellsWithType(VTK_TETRA);
-      aFilter->RegisterCellsWithType(VTK_VOXEL);
-      aFilter->RegisterCellsWithType(VTK_HEXAHEDRON);
-      aFilter->RegisterCellsWithType(VTK_WEDGE);
-      aFilter->RegisterCellsWithType(VTK_PYRAMID);
-      aFilter->RegisterCellsWithType(VTK_HEXAGONAL_PRISM);
-      aFilter->RegisterCellsWithType(VTK_QUADRATIC_TETRA);
-      aFilter->RegisterCellsWithType(VTK_QUADRATIC_HEXAHEDRON);
-      aFilter->RegisterCellsWithType(VTK_TRIQUADRATIC_HEXAHEDRON);
-      aFilter->RegisterCellsWithType(VTK_QUADRATIC_PYRAMID);
-      aFilter->RegisterCellsWithType(VTK_QUADRATIC_WEDGE);
-      aFilter->RegisterCellsWithType(VTK_CONVEX_POINT_SET);
-      aFilter->RegisterCellsWithType(VTK_POLYHEDRON);
-
-      aHightFilter->RegisterCellsWithType(VTK_TETRA);
-      aHightFilter->RegisterCellsWithType(VTK_VOXEL);
-      aHightFilter->RegisterCellsWithType(VTK_HEXAHEDRON);
-      aHightFilter->RegisterCellsWithType(VTK_WEDGE);
-      aHightFilter->RegisterCellsWithType(VTK_PYRAMID);
-      aHightFilter->RegisterCellsWithType(VTK_HEXAGONAL_PRISM);
-      aHightFilter->RegisterCellsWithType(VTK_QUADRATIC_TETRA);
-      aHightFilter->RegisterCellsWithType(VTK_QUADRATIC_HEXAHEDRON);
-      aHightFilter->RegisterCellsWithType(VTK_TRIQUADRATIC_HEXAHEDRON);
-      aHightFilter->RegisterCellsWithType(VTK_QUADRATIC_WEDGE);
-      aHightFilter->RegisterCellsWithType(VTK_QUADRATIC_PYRAMID);
-      aHightFilter->RegisterCellsWithType(VTK_CONVEX_POINT_SET);
-      aHightFilter->RegisterCellsWithType(VTK_POLYHEDRON);
+      if (myEntityMode & eFaces) {
+        aFilter->RegisterCellsWithType(VTK_TRIANGLE);
+        aFilter->RegisterCellsWithType(VTK_QUAD);
+        aFilter->RegisterCellsWithType(VTK_POLYGON);
+        aFilter->RegisterCellsWithType(VTK_QUADRATIC_TRIANGLE);
+        aFilter->RegisterCellsWithType(VTK_QUADRATIC_QUAD);
+        aFilter->RegisterCellsWithType(VTK_QUADRATIC_POLYGON);
+        aFilter->RegisterCellsWithType(VTK_BIQUADRATIC_QUAD);
+        aFilter->RegisterCellsWithType(VTK_BIQUADRATIC_TRIANGLE);
+
+        aHltFilter->RegisterCellsWithType(VTK_TRIANGLE);
+        aHltFilter->RegisterCellsWithType(VTK_QUAD);
+        aHltFilter->RegisterCellsWithType(VTK_POLYGON);
+        aHltFilter->RegisterCellsWithType(VTK_QUADRATIC_TRIANGLE);
+        aHltFilter->RegisterCellsWithType(VTK_QUADRATIC_QUAD);
+        aHltFilter->RegisterCellsWithType(VTK_QUADRATIC_POLYGON);
+        aHltFilter->RegisterCellsWithType(VTK_BIQUADRATIC_QUAD);
+        aHltFilter->RegisterCellsWithType(VTK_BIQUADRATIC_TRIANGLE);
+      }
+
+      if (myEntityMode & eVolumes) {
+        aFilter->RegisterCellsWithType(VTK_TETRA);
+        aFilter->RegisterCellsWithType(VTK_VOXEL);
+        aFilter->RegisterCellsWithType(VTK_HEXAHEDRON);
+        aFilter->RegisterCellsWithType(VTK_WEDGE);
+        aFilter->RegisterCellsWithType(VTK_PYRAMID);
+        aFilter->RegisterCellsWithType(VTK_HEXAGONAL_PRISM);
+        aFilter->RegisterCellsWithType(VTK_QUADRATIC_TETRA);
+        aFilter->RegisterCellsWithType(VTK_QUADRATIC_HEXAHEDRON);
+        aFilter->RegisterCellsWithType(VTK_TRIQUADRATIC_HEXAHEDRON);
+        aFilter->RegisterCellsWithType(VTK_QUADRATIC_PYRAMID);
+        aFilter->RegisterCellsWithType(VTK_QUADRATIC_WEDGE);
+        aFilter->RegisterCellsWithType(VTK_BIQUADRATIC_QUADRATIC_WEDGE);
+        aFilter->RegisterCellsWithType(VTK_CONVEX_POINT_SET);
+        aFilter->RegisterCellsWithType(VTK_POLYHEDRON);
+
+        aHltFilter->RegisterCellsWithType(VTK_TETRA);
+        aHltFilter->RegisterCellsWithType(VTK_VOXEL);
+        aHltFilter->RegisterCellsWithType(VTK_HEXAHEDRON);
+        aHltFilter->RegisterCellsWithType(VTK_WEDGE);
+        aHltFilter->RegisterCellsWithType(VTK_PYRAMID);
+        aHltFilter->RegisterCellsWithType(VTK_HEXAGONAL_PRISM);
+        aHltFilter->RegisterCellsWithType(VTK_QUADRATIC_TETRA);
+        aHltFilter->RegisterCellsWithType(VTK_QUADRATIC_HEXAHEDRON);
+        aHltFilter->RegisterCellsWithType(VTK_TRIQUADRATIC_HEXAHEDRON);
+        aHltFilter->RegisterCellsWithType(VTK_QUADRATIC_WEDGE);
+        aHltFilter->RegisterCellsWithType(VTK_BIQUADRATIC_QUADRATIC_WEDGE);
+        aHltFilter->RegisterCellsWithType(VTK_QUADRATIC_PYRAMID);
+        aHltFilter->RegisterCellsWithType(VTK_CONVEX_POINT_SET);
+        aHltFilter->RegisterCellsWithType(VTK_POLYHEDRON);
+      }
     }
+    if ( GetVisibility() )
+      aFilter->Update();
+    if (MYDEBUG) MESSAGE(aFilter->GetOutput()->GetNumberOfCells());
   }
-  if ( GetVisibility() )
-    aFilter->Update();
-  if (MYDEBUG) MESSAGE(aFilter->GetOutput()->GetNumberOfCells());
-  SetVisibility(GetVisibility(),false);
+
+  SetVisibility( GetVisibility(), myRepresentationCache != 0 );
 }
 
 void SMESH_ActorDef::SetRepresentation (int theMode)
@@ -1718,6 +1755,15 @@ void SMESH_ActorDef::SetRepresentation (int theMode)
   int aNb0Ds     = myVisualObj->GetNbEntities(SMDSAbs_0DElement);
   int aNbBalls   = myVisualObj->GetNbEntities(SMDSAbs_Ball);
 
+  if ( myRepresentationCache && aNbEdges + aNbFaces + aNbVolumes + aNb0Ds + aNbBalls )
+  {
+    theMode = myRepresentationCache;
+    if ( theMode == eSurface && aNbFaces + aNbVolumes == 0 )
+      theMode = eEdge;
+    else
+      myRepresentationCache = 0;
+  }
+
   if (theMode < 0) {
     myRepresentation = eSurface;
     if (!aNbFaces && !aNbVolumes && !aNbBalls && aNbEdges) {
@@ -1750,8 +1796,6 @@ void SMESH_ActorDef::SetRepresentation (int theMode)
   }
 
   myPickableActor = myBaseActor;
-  myNodeActor->SetVisibility(false);
-  myNodeExtActor->SetVisibility(false);
   vtkProperty *aProp = NULL, *aBackProp = NULL;
   vtkProperty *aPropVN = NULL, *aPropVR = NULL;
   SMESH_DeviceActor::EReperesent aReperesent = SMESH_DeviceActor::EReperesent(-1);
@@ -1759,7 +1803,6 @@ void SMESH_ActorDef::SetRepresentation (int theMode)
   switch (myRepresentation) {
   case ePoint:
     myPickableActor = myNodeActor;
-    myNodeActor->SetVisibility(true);
     aQuadraticMode = SMESH_Actor::eLines;
     aProp = aBackProp = aPropVN = aPropVR = myNodeProp;
     aReperesent = SMESH_DeviceActor::ePoint;
@@ -1777,54 +1820,50 @@ void SMESH_ActorDef::SetRepresentation (int theMode)
     break;
   }
 
-  my2DActor->SetProperty(aProp);
-  my2DActor->SetBackfaceProperty(aBackProp);
-  my2DActor->SetRepresentation(aReperesent);
+  if ( myRepresentation != ePoint )
+  {
+    my2DActor->SetProperty(aProp);
+    my2DActor->SetBackfaceProperty(aBackProp);
+    my2DActor->SetRepresentation(aReperesent);
 
-  if(aQuadraticMode == SMESH_Actor::eLines)
-    my2DActor->SetQuadraticArcMode(false);
-  else if(aQuadraticMode == SMESH_Actor::eArcs)
-    my2DActor->SetQuadraticArcMode(true);
+    if(aQuadraticMode == SMESH_Actor::eLines)
+      my2DActor->SetQuadraticArcMode(false);
+    else if(aQuadraticMode == SMESH_Actor::eArcs)
+      my2DActor->SetQuadraticArcMode(true);
 
-  my2DExtActor->SetRepresentation(aReperesent);
+    my2DExtActor->SetRepresentation(aReperesent);
 
-  my3DActor->SetProperty(aPropVN);
-  my3DActor->SetBackfaceProperty(aPropVR);
-  my3DActor->SetRepresentation(aReperesent);
+    my3DActor->SetProperty(aPropVN);
+    my3DActor->SetBackfaceProperty(aPropVR);
+    my3DActor->SetRepresentation(aReperesent);
 
+    my0DActor->SetRepresentation(aReperesent);
+    myBallActor->SetRepresentation(aReperesent);
 
-  my1DExtActor->SetVisibility(false);
-  my2DExtActor->SetVisibility(false);
-  my3DExtActor->SetVisibility(false);
-
-  my0DActor->SetRepresentation(aReperesent);
-  myBallActor->SetRepresentation(aReperesent);
-
-  switch ( myControlMode ) {
-  case eLength:
-  case eMultiConnection:
-    aProp = aBackProp = my1DProp;
-    if(myRepresentation != ePoint)
-      aReperesent = SMESH_DeviceActor::eInsideframe;
-    break;
-  default:;
-  }
+    switch ( myControlMode ) {
+    case eLength:
+    case eMultiConnection:
+      aProp = aBackProp = my1DProp;
+      if ( myRepresentation != ePoint )
+        aReperesent = SMESH_DeviceActor::eInsideframe;
+      break;
+    default:;
+    }
 
-  if(aQuadraticMode == SMESH_Actor::eLines)
-    my1DActor->SetQuadraticArcMode(false);
-  else if(aQuadraticMode == SMESH_Actor::eArcs)
-    my1DActor->SetQuadraticArcMode(true);
+    if(aQuadraticMode == SMESH_Actor::eLines)
+      my1DActor->SetQuadraticArcMode(false);
+    else if(aQuadraticMode == SMESH_Actor::eArcs)
+      my1DActor->SetQuadraticArcMode(true);
 
-  my1DActor->SetProperty(aProp);
-  my1DActor->SetBackfaceProperty(aBackProp);
-  my1DActor->SetRepresentation(aReperesent);
+    my1DActor->SetProperty(aProp);
+    my1DActor->SetBackfaceProperty(aBackProp);
+    my1DActor->SetRepresentation(aReperesent);
 
-  my1DExtActor->SetRepresentation(aReperesent);
+    my1DExtActor->SetRepresentation(aReperesent);
+  }
 
   if(myIsPointsVisible)
     myPickableActor = myNodeActor;
-  if(GetPointRepresentation())
-    myNodeActor->SetVisibility(true);
 
   SetMapper(myPickableActor->GetMapper());
 
@@ -1858,11 +1897,6 @@ void SMESH_ActorDef::UpdateHighlight()
   case SMESH_DeviceActor::eSurface:
   case SMESH_DeviceActor::eWireframe:
     {
-      // if ( !mySelector || !mySelector->IsSelectionEnabled() )
-      //   myHighlitableActor->SetUnstructuredGrid( NULL );
-      // else if ( !myHighlitableActor->myExtractUnstructuredGrid->GetInput() )
-      //   myHighlitableActor->SetUnstructuredGrid(myVisualObj->GetUnstructuredGrid());
-
       if(myIsHighlighted) {
         myHighlitableActor->SetProperty(myHighlightProp);
       }else if(myIsPreselected){
@@ -1891,6 +1925,7 @@ void SMESH_ActorDef::UpdateHighlight()
       }
       myNodeActor->SetRepresentation(SMESH_DeviceActor::ePoint);
       myNodeActor->GetExtractUnstructuredGrid()->SetModeOfExtraction(VTKViewer_ExtractUnstructuredGrid::ePoints);
+      myNodeActor->GetProperty()->Modified();
       break;
     }
   }
@@ -1902,16 +1937,16 @@ void SMESH_ActorDef::EnableSelection( bool enable )
   if ( enable && ! myBaseActor->myExtractUnstructuredGrid->GetInput() )
   {
     myBaseActor->SetUnstructuredGrid(myVisualObj->GetUnstructuredGrid());
-    myHighlitableActor->SetUnstructuredGrid(myVisualObj->GetUnstructuredGrid());
+    //myHighlitableActor->SetUnstructuredGrid(myVisualObj->GetUnstructuredGrid());
     myBaseActor->myExtractUnstructuredGrid->Update();
-    myHighlitableActor->myExtractUnstructuredGrid->Update();
+    //myHighlitableActor->myExtractUnstructuredGrid->Update();
   }
   if ( !enable && myBaseActor->myExtractUnstructuredGrid->GetInput() )
   {
     myBaseActor->SetUnstructuredGrid( NULL );
-    myHighlitableActor->SetUnstructuredGrid( NULL );
+    //myHighlitableActor->SetUnstructuredGrid( NULL );
     myBaseActor->myExtractUnstructuredGrid->Update();
-    myHighlitableActor->myExtractUnstructuredGrid->Update();
+    //myHighlitableActor->myExtractUnstructuredGrid->Update();
   }
 }
 
@@ -1937,11 +1972,11 @@ void SMESH_ActorDef::SetPreSelected(bool thePreselect)
 int SMESH_ActorDef::RenderOpaqueGeometry(vtkViewport *vp)
 {
   if (myPickableActor->GetIsOpaque())
-    {
+  {
     vtkRenderer *ren = static_cast<vtkRenderer *>(vp);
     this->Render(ren);
     return 1;
-    }
+  }
   return 0;
 }
 
@@ -1949,20 +1984,20 @@ int SMESH_ActorDef::RenderOpaqueGeometry(vtkViewport *vp)
 int SMESH_ActorDef::RenderTranslucentGeometry(vtkViewport *vp)
 {
   if (!myPickableActor->GetIsOpaque())
-    {
+  {
     vtkRenderer *ren = static_cast<vtkRenderer *>(vp);
     this->Render(ren);
     return 1;
-    }
+  }
   return 0;
 }
 
 
 void SMESH_ActorDef::Render(vtkRenderer *ren)
 {
-  unsigned long aTime = myTimeStamp->GetMTime();
-  unsigned long anObjTime = myVisualObj->GetUnstructuredGrid()->GetMTime();
-  unsigned long aClippingTime = myImplicitBoolean->GetMTime();
+  vtkMTimeType aTime = myTimeStamp->GetMTime();
+  vtkMTimeType anObjTime = myVisualObj->GetUnstructuredGrid()->GetMTime();
+  vtkMTimeType aClippingTime = myImplicitBoolean->GetMTime();
   if(anObjTime > aTime || aClippingTime > aTime)
     Update();
 }
@@ -2003,9 +2038,9 @@ void SMESH_ActorDef::Update()
     SetFacesOriented(myIsFacesOriented);
   }
 
-  if(myVisualObj->GetEntitiesFlag()) {
-    myEntityMode |= myVisualObj->GetEntitiesState();
-  }
+  // if(myVisualObj->GetEntitiesFlag()) { IPAL53915
+  //   myEntityMode |= myVisualObj->GetEntitiesState();
+  // }
 
   SetEntityMode(GetEntityMode());
   SetVisibility(GetVisibility());
@@ -2165,29 +2200,19 @@ void SMESH_ActorDef::GetBallColor(double& r,double& g,double& b)
   ::GetColor(myBallProp,r,g,b);
 }
 
-void SMESH_ActorDef::SetHighlightColor(double r,double g,double b)
-{ 
-  myHighlightProp->SetColor(r,g,b);
-  Modified();
-}
-
-void SMESH_ActorDef::GetHighlightColor(double& r,double& g,double& b)
-{ 
-  ::GetColor(myHighlightProp,r,g,b);
-}
-
-void SMESH_ActorDef::SetPreHighlightColor(double r,double g,double b)
-{ 
-  myPreselectProp->SetColor(r,g,b);
+void SMESH_ActorDef::UpdateSelectionProps()
+{
+  QColor selectionColor = SMESH_ActorProps::props()->selectionColor();
+  QColor highlightColor = SMESH_ActorProps::props()->highlightColor();
+  int selectionIncrement = SMESH_ActorProps::props()->selectionIncrement();
+  double width = GetLineWidth();
+  myHighlightProp->SetColor(selectionColor.redF(), selectionColor.greenF(), selectionColor.blueF());
+  myHighlightProp->SetLineWidth(width + selectionIncrement);
+  myPreselectProp->SetColor(highlightColor.redF(), highlightColor.greenF(), highlightColor.blueF());
+  myPreselectProp->SetLineWidth(width + selectionIncrement);
   Modified();
 }
 
-void SMESH_ActorDef::GetPreHighlightColor(double& r,double& g,double& b)
-{ 
-  ::GetColor(myPreselectProp,r,g,b);
-}
-
-
 double SMESH_ActorDef::GetLineWidth()
 {
   return myEdgeProp->GetLineWidth();
@@ -2196,15 +2221,17 @@ double SMESH_ActorDef::GetLineWidth()
 
 void SMESH_ActorDef::SetLineWidth(double theVal)
 {
+  int controlsIncrement = SMESH_ActorProps::props()->controlsIncrement();
+  int selectionIncrement = SMESH_ActorProps::props()->selectionIncrement();
+
   myEdgeProp->SetLineWidth(theVal);
 
-  my1DProp->SetLineWidth(theVal + aLineWidthInc);
-  my1DExtProp->SetLineWidth(theVal + aLineWidthInc);
-  my2DExtProp->SetLineWidth(theVal + aLineWidthInc);
-  my3DExtProp->SetLineWidth(theVal + aLineWidthInc);
-  myOutLineProp->SetLineWidth(theVal);
-  myHighlightProp->SetLineWidth(theVal);
-  myPreselectProp->SetLineWidth(theVal);
+  my1DProp->SetLineWidth(theVal + controlsIncrement);
+  my1DExtProp->SetLineWidth(theVal + controlsIncrement);
+  my2DExtProp->SetLineWidth(theVal + controlsIncrement);
+  my3DExtProp->SetLineWidth(theVal + controlsIncrement);
+  myHighlightProp->SetLineWidth(theVal + selectionIncrement);
+  myPreselectProp->SetLineWidth(theVal + selectionIncrement);
   Modified();
 }
 
@@ -2348,7 +2375,7 @@ void SMESH_ActorDef::SetOpenGLClippingPlane()
   if ( !mySelector || !mySelector->IsSelectionEnabled() )
   {
     myBaseActor->SetUnstructuredGrid( NULL );
-    myHighlitableActor->SetUnstructuredGrid( NULL );
+    //myHighlitableActor->SetUnstructuredGrid( NULL );
   }
   my1DActor->SetPlaneCollection( myPlaneCollection );
   my1DActor->SetUnstructuredGrid(myVisualObj->GetUnstructuredGrid());