Salome HOME
Fix for "0023302: [EDF 12800] Ergonomics of mesh group export operation" issue
[modules/smesh.git] / src / SMESHGUI / SMESHGUI.cxx
index de3f26559900713a3cfa74842478cd418f9ef699..701fc912788e6222945be80026c75f8f859af560 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2015  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2016  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -82,6 +82,7 @@
 #include "SMESHGUI_TranslationDlg.h"
 #include "SMESHGUI_TransparencyDlg.h"
 #include "SMESHGUI_DisplayEntitiesDlg.h"
+#include "SMESHGUI_SplitBiQuad.h"
 
 #include "SMESHGUI_FilterUtils.h"
 #include "SMESHGUI_GEOMGenUtils.h"
 
 #include <VTKViewer_Algorithm.h>
 
-#include <PyInterp_Interp.h>
-
 #include <SUIT_Desktop.h>
 #include <SUIT_FileDlg.h>
 #include <SUIT_MessageBox.h>
 #include <QTextStream>
 #include <QListView>
 #include <QTreeView>
+#include <QCheckBox>
+#include <QLayout>
+#include <QDialogButtonBox>
 
 // BOOST includes
 #include <boost/shared_ptr.hpp>
 // OCCT includes
 #include <Standard_ErrorHandler.hxx>
 #include <NCollection_DataMap.hxx>
+#include <NCollection_DoubleMap.hxx>
 
 #include <Basics_Utils.hxx>
 
-//To disable automatic genericobj management, the following line should be commented.
-//Otherwise, it should be uncommented.
-//Refer to KERNEL_SRC/src/SALOMEDSImpl/SALOMEDSImpl_AttributeIOR.cxx
-#define WITHGENERICOBJ
-
 // Below macro, when uncommented, switches on simplified (more performant) algorithm
 // of auto-color picking up
 #define SIMPLE_AUTOCOLOR
@@ -192,7 +190,7 @@ namespace
   // Declarations
   //=============================================================
   void ImportMeshesFromFile(SMESH::SMESH_Gen_ptr theComponentMesh,
-                            int theCommandID);
+                            int                  theCommandID);
 
   void ExportMeshToFile(int theCommandID);
 
@@ -200,6 +198,8 @@ namespace
 
   void SetDisplayEntity(int theCommandID);
 
+  int  ActionToControl( int theID, bool theReversed = false );
+
   void Control( int theCommandID );
 
   // Definitions
@@ -210,7 +210,7 @@ namespace
   //================================================================================
 
   void ImportMeshesFromFile( SMESH::SMESH_Gen_ptr theComponentMesh,
-                             int theCommandID )
+                             int                  theCommandID )
   {
     QStringList filter;
     std::string myExtension;
@@ -268,14 +268,16 @@ namespace
                                                   filter,
                                                   QObject::tr( "SMESH_IMPORT_MESH" ) );
     }
-    if ( filenames.count() > 0 ) {
+    if ( filenames.count() > 0 )
+    {
       SUIT_OverrideCursor wc;
       _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
 
       QStringList errors;
       QStringList anEntryList;
       bool isEmpty = false;
-      for ( QStringList::ConstIterator it = filenames.begin(); it != filenames.end(); ++it ) {
+      for ( QStringList::ConstIterator it = filenames.begin(); it != filenames.end(); ++it )
+      {
         QString filename = *it;
         SMESH::mesh_array_var aMeshes = new SMESH::mesh_array;
         try {
@@ -368,7 +370,8 @@ namespace
                          arg( QObject::tr( "SMESH_ERR_UNKNOWN_IMPORT_ERROR" ) ) );
         }
 
-        for ( int i = 0, iEnd = aMeshes->length(); i < iEnd; i++ ) {
+        for ( int i = 0, iEnd = aMeshes->length(); i < iEnd; i++ )
+        {
           _PTR(SObject) aMeshSO = SMESH::FindSObject( aMeshes[i] );
           if ( aMeshSO ) {
             _PTR(StudyBuilder) aBuilder = aStudy->NewBuilder();
@@ -422,38 +425,72 @@ namespace
     if( aSel )
       aSel->selectedObjects( selected );
 
-    const bool isDAT = ( theCommandID == SMESHOp::OpExportDAT || theCommandID == SMESHOp::OpPopupExportDAT );
-    const bool isMED = ( theCommandID == SMESHOp::OpExportMED || theCommandID == SMESHOp::OpPopupExportMED );
-    const bool isUNV = ( theCommandID == SMESHOp::OpExportUNV || theCommandID == SMESHOp::OpPopupExportUNV );
-    const bool isSTL = ( theCommandID == SMESHOp::OpExportSTL || theCommandID == SMESHOp::OpPopupExportSTL );
-  #ifdef WITH_CGNS
-    const bool isCGNS= ( theCommandID == SMESHOp::OpExportCGNS || theCommandID == SMESHOp::OpPopupExportCGNS );
-  #else
+    const bool isDAT = ( theCommandID == SMESHOp::OpExportDAT ||
+                         theCommandID == SMESHOp::OpPopupExportDAT );
+    const bool isMED = ( theCommandID == SMESHOp::OpExportMED ||
+                         theCommandID == SMESHOp::OpPopupExportMED );
+    const bool isUNV = ( theCommandID == SMESHOp::OpExportUNV ||
+                         theCommandID == SMESHOp::OpPopupExportUNV );
+    const bool isSTL = ( theCommandID == SMESHOp::OpExportSTL ||
+                         theCommandID == SMESHOp::OpPopupExportSTL );
+#ifdef WITH_CGNS
+    const bool isCGNS= ( theCommandID == SMESHOp::OpExportCGNS ||
+                         theCommandID == SMESHOp::OpPopupExportCGNS );
+#else
     const bool isCGNS= false;
-  #endif
-    const bool isSAUV= ( theCommandID == SMESHOp::OpExportSAUV || theCommandID == SMESHOp::OpPopupExportSAUV );
-    const bool isGMF = ( theCommandID == SMESHOp::OpExportGMF || theCommandID == SMESHOp::OpPopupExportGMF );
+#endif
+    const bool isSAUV= ( theCommandID == SMESHOp::OpExportSAUV ||
+                         theCommandID == SMESHOp::OpPopupExportSAUV );
+    const bool isGMF = ( theCommandID == SMESHOp::OpExportGMF ||
+                         theCommandID == SMESHOp::OpPopupExportGMF );
 
-    // actually, the following condition can't be met (added for insurance)
-    if( selected.Extent() == 0 ||
-        ( selected.Extent() > 1 && !isMED && !isSTL ))
+    const bool multiMeshSupported = ( isMED || isCGNS ); // file can hold several meshes
+    if ( selected.Extent() == 0 || ( selected.Extent() > 1 && !multiMeshSupported ))
       return;
-
+    SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
+    bool aCheckWarn = true;
+    if ( resMgr )
+      aCheckWarn = resMgr->booleanValue( "SMESH", "show_warning", false );
     // get mesh object from selection and check duplication of their names
     bool hasDuplicatedMeshNames = false;
-    QList< QPair< SMESH::SMESH_IDSource_var, QString > > aMeshList;
+    QList< QPair< SMESH::SMESH_IDSource_var, QString > >           aMeshList;
     QList< QPair< SMESH::SMESH_IDSource_var, QString > >::iterator aMeshIter;
     SALOME_ListIteratorOfListIO It( selected );
     for( ; It.More(); It.Next() )
     {
       Handle(SALOME_InteractiveObject) anIObject = It.Value();
-      SMESH::SMESH_IDSource_var aMeshItem = SMESH::IObjectToInterface<SMESH::SMESH_IDSource>(anIObject);
+      SMESH::SMESH_IDSource_var aMeshItem =
+        SMESH::IObjectToInterface<SMESH::SMESH_IDSource>(anIObject);
       if ( aMeshItem->_is_nil() ) {
         SUIT_MessageBox::warning( SMESHGUI::desktop(),
                                   QObject::tr( "SMESH_WRN_WARNING" ),
                                   QObject::tr( "SMESH_BAD_MESH_SELECTION" ));
         return;
       }
+      SMESH::SMESH_GroupBase_var aGroup   = SMESH::SMESH_GroupBase::_narrow( aMeshItem );
+      if ( aCheckWarn && !aGroup->_is_nil() ) {
+        QMessageBox msgBox(SUIT_MessageBox::Warning,QObject::tr("SMESH_WRN_WARNING"),
+                            QObject::tr("SMESH_EXPORT_ONLY_GPOUP"),QMessageBox::StandardButton::NoButton, SMESHGUI::desktop());
+        QCheckBox dontShowCheckBox(QObject::tr("SMESH_WRN_SHOW_DLG_CHECKBOX"));
+        msgBox.addButton(QMessageBox::Ok);
+        msgBox.addButton(QMessageBox::Cancel);
+        msgBox.setDefaultButton(QMessageBox::Cancel);
+        QGridLayout* lt = qobject_cast<QGridLayout*>(msgBox.layout());
+        QDialogButtonBox* btnbox = msgBox.findChild<QDialogButtonBox*>();
+        lt->addWidget(&dontShowCheckBox, lt->rowCount(), lt->columnCount()-1, lt->rowCount(), lt->columnCount());
+        lt->addWidget(btnbox, lt->rowCount(), 0, lt->rowCount(), lt->columnCount());
+        if(msgBox.exec() == QMessageBox::Ok)
+        {
+            if(dontShowCheckBox.checkState() == Qt::Checked)
+            {
+              if ( resMgr )
+                resMgr->setValue( "SMESH", "show_warning", false);
+            }
+            aCheckWarn = false;
+        }
+        else
+          return;
+      }
 
       QString aMeshName = anIObject->getName();
 
@@ -535,7 +572,6 @@ namespace
     {
       format = "CGNS";
       notSupportedElemTypes.push_back( SMESH::Entity_Ball );
-      notSupportedElemTypes.push_back( SMESH::Entity_BiQuad_Triangle );
     }
     else if ( isSAUV )
     {
@@ -546,6 +582,7 @@ namespace
       notSupportedElemTypes.push_back( SMESH::Entity_TriQuad_Hexa );
       notSupportedElemTypes.push_back( SMESH::Entity_Hexagonal_Prism );
       notSupportedElemTypes.push_back( SMESH::Entity_Polygon );
+      notSupportedElemTypes.push_back( SMESH::Entity_Quad_Polygon );
       notSupportedElemTypes.push_back( SMESH::Entity_Polyhedra );
     }
     else if ( isGMF )
@@ -571,7 +608,7 @@ namespace
     if ( !presentNotSupported.empty() )
     {
       QString typeNames;
-      const char* typeMsg[SMESH::Entity_Last] = {
+      const char* typeMsg[] = {
         "SMESH_NODES", "SMESH_ELEMS0D","SMESH_EDGES","SMESH_QUADRATIC_EDGES",
         "SMESH_TRIANGLES", "SMESH_QUADRATIC_TRIANGLES", "SMESH_BIQUADRATIC_TRIANGLES",
         "SMESH_QUADRANGLES","SMESH_QUADRATIC_QUADRANGLES", "SMESH_BIQUADRATIC_QUADRANGLES",
@@ -581,6 +618,10 @@ namespace
         "SMESH_TRIQUADRATIC_HEXAHEDRONS","SMESH_PENTAHEDRA","SMESH_QUADRATIC_PENTAHEDRONS",
         "SMESH_OCTAHEDRA","SMESH_POLYEDRONS","SMESH_QUADRATIC_POLYEDRONS","SMESH_BALLS"
       };
+      // is typeMsg complete? (compilation failure mains that enum SMDSAbs_EntityType changed)
+      const int nbTypes = sizeof( typeMsg ) / sizeof( const char* );
+      int _assert[( nbTypes == SMESH::Entity_Last ) ? 2 : -1 ]; _assert[0]=_assert[1];
+
       QString andStr = " " + QObject::tr("SMESH_AND") + " ", comma(", ");
       for ( size_t iType = 0; iType < presentNotSupported.size(); ++iType ) {
         typeNames += QObject::tr( typeMsg[ presentNotSupported[ iType ]]);
@@ -600,14 +641,13 @@ namespace
     // Get parameters of export operation
 
     QString            aFilename;
-    SMESH::MED_VERSION aFormat;
+    SMESH::MED_VERSION aFormat = SMESH::MED_V2_2;
     // Init the parameters with the default values
     bool aIsASCII_STL   = true;
     bool toCreateGroups = false;
-    SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
     if ( resMgr )
       toCreateGroups = resMgr->booleanValue( "SMESH", "auto_groups", false );
-    bool toOverwrite = true;
+    bool toOverwrite  = true;
     bool toFindOutDim = true;
 
     QString aFilter, aTitle = QObject::tr("SMESH_EXPORT_MESH");
@@ -918,7 +958,7 @@ namespace
   }
 
   inline void InverseEntityMode(unsigned int& theOutputMode,
-                                unsigned int theMode)
+                                unsigned int  theMode)
   {
     bool anIsNotPresent = ~theOutputMode & theMode;
     if(anIsNotPresent)
@@ -927,13 +967,14 @@ namespace
       theOutputMode &= ~theMode;
   }
 
-  void SetDisplayEntity(int theCommandID){
+  void SetDisplayEntity(int theCommandID)
+  {
     LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
     SALOME_ListIO selected;
-    if( aSel )
+    if ( aSel )
       aSel->selectedObjects( selected );
 
-    if(selected.Extent() >= 1){
+    if ( selected.Extent() >= 1 ) {
       SALOME_ListIteratorOfListIO It( selected );
       for( ; It.More(); It.Next()){
         Handle(SALOME_InteractiveObject) IObject = It.Value();
@@ -941,24 +982,12 @@ namespace
           if(SMESH_Actor *anActor = SMESH::FindActorByEntry(IObject->getEntry())){
             unsigned int aMode = anActor->GetEntityMode();
             switch(theCommandID){
-            case SMESHOp::OpDE0DElements:
-              InverseEntityMode(aMode,SMESH_Actor::e0DElements);
-              break;
-            case SMESHOp::OpDEEdges:
-              InverseEntityMode(aMode,SMESH_Actor::eEdges);
-              break;
-            case SMESHOp::OpDEFaces:
-              InverseEntityMode(aMode,SMESH_Actor::eFaces);
-              break;
-            case SMESHOp::OpDEVolumes:
-              InverseEntityMode(aMode,SMESH_Actor::eVolumes);
-              break;
-            case SMESHOp::OpDEBalls:
-              InverseEntityMode(aMode,SMESH_Actor::eBallElem);
-              break;
-            case SMESHOp::OpDEAllEntity:
-              aMode = SMESH_Actor::eAllEntity;
-              break;
+            case SMESHOp::OpDE0DElements: InverseEntityMode(aMode,SMESH_Actor::e0DElements); break;
+            case SMESHOp::OpDEEdges:      InverseEntityMode(aMode,SMESH_Actor::eEdges); break;
+            case SMESHOp::OpDEFaces:      InverseEntityMode(aMode,SMESH_Actor::eFaces); break;
+            case SMESHOp::OpDEVolumes:    InverseEntityMode(aMode,SMESH_Actor::eVolumes); break;
+            case SMESHOp::OpDEBalls:      InverseEntityMode(aMode,SMESH_Actor::eBallElem); break;
+            case SMESHOp::OpDEAllEntity:  aMode = SMESH_Actor::eAllEntity; break;
             }
             if(aMode)
               anActor->SetEntityMode(aMode);
@@ -970,26 +999,27 @@ namespace
 
   void AutoColor()
   {
-    SALOME_ListIO selected;
-    SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
-    if( !app )
+    SalomeApp_Application* app =
+      dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
+    if ( !app )
       return;
 
     LightApp_SelectionMgr* aSel = app->selectionMgr();
     SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( app->activeStudy() );
-    if( !aSel || !appStudy )
+    if ( !aSel || !appStudy )
       return;
 
+    SALOME_ListIO selected;
     aSel->selectedObjects( selected );
-    if( selected.IsEmpty() )
+    if ( selected.IsEmpty() )
       return;
 
     Handle(SALOME_InteractiveObject) anIObject = selected.First();
 
-    _PTR(Study) aStudy = appStudy->studyDS();
-    _PTR(SObject) aMainSObject( aStudy->FindObjectID( anIObject->getEntry() ) );
+    _PTR(Study)         aStudy = appStudy->studyDS();
+    _PTR(SObject) aMainSObject = aStudy->FindObjectID( anIObject->getEntry() );
     SMESH::SMESH_Mesh_var aMainObject = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(anIObject);
-    if( aMainObject->_is_nil() )
+    if ( aMainObject->_is_nil() )
       return;
 
     SUIT_OverrideCursor wc;
@@ -999,10 +1029,9 @@ namespace
     QList<SALOMEDS::Color> aReservedColors;
 
     SMESH::ListOfGroups aListOfGroups = *aMainObject->GetGroups();
-    for( int i = 0, n = aListOfGroups.length(); i < n; i++ )
+    for ( int i = 0, n = aListOfGroups.length(); i < n; i++ )
     {
       SMESH::SMESH_GroupBase_var aGroupObject = aListOfGroups[i];
-      //SALOMEDS::Color aColor = aGroupObject->GetColor();
 
 #ifdef SIMPLE_AUTOCOLOR   // simplified algorithm for auto-colors
       SALOMEDS::Color aColor = SMESHGUI::getPredefinedUniqueColor();
@@ -1013,10 +1042,10 @@ namespace
       aGroupObject->SetColor( aColor );
 
       _PTR(SObject) aGroupSObject = SMESH::FindSObject(aGroupObject);
-      if (aGroupSObject) {
+      if ( aGroupSObject ) {
         QColor c;
         int delta;
-        if(SMESH_Actor *anActor = SMESH::FindActorByEntry(aGroupSObject->GetID().c_str())) {
+        if ( SMESH_Actor *anActor = SMESH::FindActorByEntry(aGroupSObject->GetID().c_str())) {
           switch ( aGroupObject->GetType ()) {
           case SMESH::NODE:
             anActor->SetNodeColor( aColor.R, aColor.G, aColor.B ); break;
@@ -1041,7 +1070,8 @@ namespace
     SMESH::RepaintCurrentView();
   }
 
-  void OverallMeshQuality() {
+  void OverallMeshQuality()
+  {
     SMESHGUI::GetSMESHGUI()->EmitSignalDeactivateDialog();
     LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
     SALOME_ListIO selected;
@@ -1126,11 +1156,15 @@ namespace
       Handle(SALOME_InteractiveObject) anIO = selected.First();
       if ( anIO->hasEntry() ) {
         SMESH_Actor* anActor = SMESH::FindActorByEntry( anIO->getEntry() );
-        if ( anActor && anActor->GetScalarBarActor() && anActor->GetControlMode() != SMESH_Actor::eNone ) {
+        if ( anActor &&
+             anActor->GetScalarBarActor() &&
+             anActor->GetControlMode() != SMESH_Actor::eNone )
+        {
           SMESH_ScalarBarActor* aScalarBarActor = anActor->GetScalarBarActor();
           SMESH::Controls::FunctorPtr aFunctor = anActor->GetFunctor();
           if ( aScalarBarActor && aFunctor ) {
-            SMESH::Controls::NumericalFunctor* aNumFun = dynamic_cast<SMESH::Controls::NumericalFunctor*>( aFunctor.get() );
+            SMESH::Controls::NumericalFunctor* aNumFun =
+              dynamic_cast<SMESH::Controls::NumericalFunctor*>( aFunctor.get() );
             if ( aNumFun ) {
               std::vector<int> elements;
               SMESH::SMESH_Mesh_var mesh = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(anIO);
@@ -1152,7 +1186,8 @@ namespace
               bool isLogarithmic = lookupTable->GetScale() == VTK_SCALE_LOG10;
               std::vector<int>    nbEvents;
               std::vector<double> funValues;
-              aNumFun->GetHistogram( nbIntervals, nbEvents, funValues, elements, minmax, isLogarithmic );
+              aNumFun->GetHistogram( nbIntervals, nbEvents, funValues,
+                                     elements, minmax, isLogarithmic );
               QString anInitialPath = "";
               if ( SUIT_FileDlg::getLastVisitedPath().isEmpty() )
                 anInitialPath = QDir::currentPath();
@@ -1160,7 +1195,7 @@ namespace
               QStringList filter;
               filter.append( QObject::tr( "TEXT_FILES_FILTER" ) + " (*.txt)" );
               filter.append( QObject::tr( "ALL_FILES_FILTER" ) + " (*)" );
-              QString aFilename = anInitialPath + "/" + aMeshName + "_" + 
+              QString aFilename = anInitialPath + "/" + aMeshName + "_" +
                 functorToString( aFunctor ).toLower().simplified().replace( QRegExp( " |-" ), "_" ) + ".txt";
               aFilename = SUIT_FileDlg::getFileName( SMESHGUI::desktop(),
                                                      aFilename,
@@ -1175,7 +1210,7 @@ namespace
                   out << "# Control: " << functorToString( aFunctor ) << endl;
                   out << "#" << endl;
                   out.setFieldWidth( 10 );
-                  for ( int i = 0; i < qMin( nbEvents.size(), funValues.size()-1 ); i++ )
+                  for ( int i = 0; i < (int)qMin( nbEvents.size(), funValues.size()-1 ); i++ )
                     out << funValues[i] << "\t" << funValues[i+1] << "\t" << nbEvents[i] << endl;
                   f.close();
                 }
@@ -1187,77 +1222,90 @@ namespace
     }
   }
 
-  void ShowDistribution() {
+  void ShowElement( int theCommandID )
+  {
     LightApp_SelectionMgr* aSel = SMESHGUI::selectionMgr();
     SALOME_ListIO selected;
     if ( aSel )
       aSel->selectedObjects( selected );
-    
+
     if ( selected.Extent() == 1 ) {
       Handle(SALOME_InteractiveObject) anIO = selected.First();
       if ( anIO->hasEntry() ) {
         SMESH_Actor* anActor = SMESH::FindActorByEntry( anIO->getEntry() );
-        if ( anActor && anActor->GetScalarBarActor() && anActor->GetControlMode() != SMESH_Actor::eNone ) {
+        if ( anActor &&
+             anActor->GetScalarBarActor() &&
+             anActor->GetControlMode() != SMESH_Actor::eNone )
+        {
           SMESH_ScalarBarActor *aScalarBarActor = anActor->GetScalarBarActor();
-          aScalarBarActor->SetDistributionVisibility(!aScalarBarActor->GetDistributionVisibility());
+          if ( theCommandID == SMESHOp::OpShowDistribution ) {
+            aScalarBarActor->SetDistributionVisibility(!aScalarBarActor->GetDistributionVisibility());
+          }
+          else if ( theCommandID == SMESHOp::OpShowScalarBar ) {
+            aScalarBarActor->SetVisibility( !aScalarBarActor->GetVisibility());
+          }
         }
       }
     }
   }
 
 #ifndef DISABLE_PLOT2DVIEWER
- void PlotDistribution() {
-   SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
-   if( !app )
-     return;
-
-   LightApp_SelectionMgr* aSel = SMESHGUI::selectionMgr();
-   SALOME_ListIO selected;
-   if ( aSel )
-     aSel->selectedObjects( selected );
-    
-   if ( selected.Extent() == 1 ) {
-     Handle(SALOME_InteractiveObject) anIO = selected.First();
-     if ( anIO->hasEntry() ) {
-       //Find Actor by entry before getting Plot2d viewer,
-       //because after call getViewManager( Plot2d_Viewer::Type(), true ) active window is Plot2d Viewer
-       SMESH_Actor* anActor = SMESH::FindActorByEntry( anIO->getEntry() );
-
-       SUIT_ViewManager* aViewManager = app->getViewManager( Plot2d_Viewer::Type(), true ); // create if necessary
-
-       if( !aViewManager )
-         return;
-       
-       SPlot2d_Viewer* aView = dynamic_cast<SPlot2d_Viewer*>(aViewManager->getViewModel());
-       if ( !aView )
-         return;
-
-       Plot2d_ViewFrame* aPlot = aView->getActiveViewFrame();
-       if ( !aPlot )
-         return;
-
-       if ( anActor && anActor->GetControlMode() != SMESH_Actor::eNone ) {
-         SPlot2d_Histogram* aHistogram = anActor->UpdatePlot2Histogram();
-         QString functorName = functorToString( anActor->GetFunctor());
-         QString aHistogramName("%1 : %2");
-         aHistogramName = aHistogramName.arg(anIO->getName()).arg(functorName);
-         aHistogram->setName(aHistogramName);
-         aHistogram->setHorTitle(functorName);
-         aHistogram->setVerTitle(QObject::tr("DISTRIBUTION_NB_ENT"));
-         aPlot->displayObject(aHistogram, true);
-       }
-     }
-   }
- }
+  void PlotDistribution()
+  {
+    SalomeApp_Application* app =
+      dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
+    if( !app )
+      return;
+
+    LightApp_SelectionMgr* aSel = SMESHGUI::selectionMgr();
+    SALOME_ListIO selected;
+    if ( aSel )
+      aSel->selectedObjects( selected );
+
+    if ( selected.Extent() == 1 ) {
+      Handle(SALOME_InteractiveObject) anIO = selected.First();
+      if ( anIO->hasEntry() ) {
+        //Find Actor by entry before getting Plot2d viewer,
+        //because after call getViewManager( Plot2d_Viewer::Type(), true ) active window is Plot2d Viewer
+        SMESH_Actor* anActor = SMESH::FindActorByEntry( anIO->getEntry() );
+
+        SUIT_ViewManager* aViewManager =
+          app->getViewManager( Plot2d_Viewer::Type(), true ); // create if necessary
+        if( !aViewManager )
+          return;
+
+        SPlot2d_Viewer* aView = dynamic_cast<SPlot2d_Viewer*>(aViewManager->getViewModel());
+        if ( !aView )
+          return;
+
+        Plot2d_ViewFrame* aPlot = aView->getActiveViewFrame();
+        if ( !aPlot )
+          return;
+
+        if ( anActor && anActor->GetControlMode() != SMESH_Actor::eNone )
+        {
+          SPlot2d_Histogram* aHistogram = anActor->UpdatePlot2Histogram();
+          QString functorName = functorToString( anActor->GetFunctor());
+          QString aHistogramName("%1 : %2");
+          aHistogramName = aHistogramName.arg(anIO->getName()).arg(functorName);
+          aHistogram->setName(aHistogramName);
+          aHistogram->setHorTitle(functorName);
+          aHistogram->setVerTitle(QObject::tr("DISTRIBUTION_NB_ENT"));
+          aPlot->displayObject(aHistogram, true);
+        }
+      }
+    }
+  }
 #endif //DISABLE_PLOT2DVIEWER
 
-  void DisableAutoColor(){
+  void DisableAutoColor()
+  {
     LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
     SALOME_ListIO selected;
-    if( aSel )
+    if ( aSel )
       aSel->selectedObjects( selected );
 
-    if(selected.Extent()){
+    if ( selected.Extent() ) {
       Handle(SALOME_InteractiveObject) anIObject = selected.First();
       SMESH::SMESH_Mesh_var aMesh = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(anIObject);
       if ( !aMesh->_is_nil() ) {
@@ -1266,13 +1314,14 @@ namespace
     }
   }
 
-  void sortChildren(){
+  void sortChildren()
+  {
     LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
     SALOME_ListIO selected;
-    if( aSel ) {
+    if ( aSel ) {
       aSel->selectedObjects( selected );
-
-      if(selected.Extent()){
+      if ( selected.Extent() )
+      {
         Handle(SALOME_InteractiveObject) anIObject = selected.First();
         _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
         _PTR(SObject) aSObj = aStudy->FindObjectID(anIObject->getEntry());
@@ -1288,17 +1337,18 @@ namespace
   void SetDisplayMode(int theCommandID, SMESHGUI_StudyId2MarkerMap& theMarkerMap)
   {
     SALOME_ListIO selected;
-    SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
-    if( !app )
+    SalomeApp_Application* app =
+      dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
+    if ( !app )
       return;
 
     LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
-    SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( app->activeStudy() );
-    if( !aSel || !appStudy )
+    SalomeApp_Study*   appStudy = dynamic_cast<SalomeApp_Study*>( app->activeStudy() );
+    if ( !aSel || !appStudy )
       return;
 
-    if( theCommandID == SMESHOp::OpClipping ) { // Clipping dialog can be activated without selection
-      if( SMESHGUI* aModule = SMESHGUI::GetSMESHGUI() ) {
+    if ( theCommandID == SMESHOp::OpClipping ) { // Clipping dialog can be activated without selection
+      if ( SMESHGUI* aModule = SMESHGUI::GetSMESHGUI() ) {
         aModule->EmitSignalDeactivateDialog();
         if( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( aModule ) )
           (new SMESHGUI_ClippingDlg( aModule, aViewWindow ))->show();
@@ -1310,20 +1360,23 @@ namespace
 
     aSel->selectedObjects( selected );
 
-    if(selected.Extent() >= 1){
-      switch(theCommandID){
-      case SMESHOp::OpTransparency:{
+    if ( selected.Extent() >= 1 )
+    {
+      switch ( theCommandID ) {
+      case SMESHOp::OpTransparency:
+      {
         SMESHGUI::GetSMESHGUI()->EmitSignalDeactivateDialog();
         (new SMESHGUI_TransparencyDlg( SMESHGUI::GetSMESHGUI() ))->show();
         return;
       }
-      case SMESHOp::OpProperties: {
+      case SMESHOp::OpProperties:
+      {
         double color[3];
         QColor faceColor, edgeColor, nodeColor, elem0dColor, ballColor;
         QColor orientationColor, outlineColor, volumeColor;
         int deltaF = 0, deltaV = 0;
         int elem0dSize   = 1;
-        int ballSize     = 1;
+        //int ballSize     = 1;
         double ballScale = 1.0;
         int edgeWidth    = 1;
         int outlineWidth = 1;
@@ -1368,7 +1421,7 @@ namespace
             // balls: color, size
             anActor->GetBallColor( color[0], color[1], color[2] );
             ballColor.setRgbF( color[0], color[1], color[2] );
-            ballSize = qMax( (int)anActor->GetBallSize(), 1 ); // minimum allowed size is 1
+            //ballSize = qMax( (int)anActor->GetBallSize(), 1 ); // minimum allowed size is 1
             ballScale = qMax( (double)anActor->GetBallScale(), 1e-2 ); // minimum allowed scale is 1e-2
             // outlines: color
             anActor->GetOutlineColor( color[0], color[1], color[2] );
@@ -1425,7 +1478,7 @@ namespace
         dlg.setElem0dSize( elem0dSize );
         // balls: color, size
         dlg.setBallColor( ballColor );
-        dlg.setBallSize( ballSize );
+        //dlg.setBallSize( ballSize );
         dlg.setBallScale( ballScale );
         // orientation: color, scale, 3d flag
         dlg.setOrientationColor( orientationColor );
@@ -1452,7 +1505,7 @@ namespace
           elem0dColor      = dlg.elem0dColor();
           elem0dSize       = dlg.elem0dSize();
           ballColor        = dlg.ballColor();
-          ballSize         = dlg.ballSize();
+         // ballSize         = dlg.ballSize();
           ballScale        = dlg.ballScale();
           orientationColor = dlg.orientationColor();
           orientationScale = dlg.orientationSize() / 100.;
@@ -1496,7 +1549,7 @@ namespace
             anActor->Set0DSize( elem0dSize );
             // balls: color, size
             anActor->SetBallColor( ballColor.redF(), ballColor.greenF(), ballColor.blueF() );
-            anActor->SetBallSize( ballSize );
+            // anActor->SetBallSize( ballSize );
             anActor->SetBallScale( ballScale );
             // orientation: color, scale, 3d flag
             anActor->SetFacesOrientationColor( orientationColor.redF(), orientationColor.greenF(), orientationColor.blueF() );
@@ -1577,121 +1630,86 @@ namespace
     }
   }
 
+  int ActionToControl( int theID, bool theReversed )
+  {
+    NCollection_DoubleMap<int,int> ActionControl;
+    ActionControl.Bind( 0,                                SMESH_Actor::eNone );
+    ActionControl.Bind( SMESHOp::OpFreeNode,              SMESH_Actor::eFreeNodes );
+    ActionControl.Bind( SMESHOp::OpEqualNode,             SMESH_Actor::eCoincidentNodes );
+    ActionControl.Bind( SMESHOp::OpFreeEdge,              SMESH_Actor::eFreeEdges );
+    ActionControl.Bind( SMESHOp::OpFreeBorder,            SMESH_Actor::eFreeBorders );
+    ActionControl.Bind( SMESHOp::OpLength,                SMESH_Actor::eLength );
+    ActionControl.Bind( SMESHOp::OpConnection,            SMESH_Actor::eMultiConnection );
+    ActionControl.Bind( SMESHOp::OpEqualEdge,             SMESH_Actor::eCoincidentElems1D );
+    ActionControl.Bind( SMESHOp::OpFreeFace,              SMESH_Actor::eFreeFaces );
+    ActionControl.Bind( SMESHOp::OpBareBorderFace,        SMESH_Actor::eBareBorderFace );
+    ActionControl.Bind( SMESHOp::OpOverConstrainedFace,   SMESH_Actor::eOverConstrainedFace );
+    ActionControl.Bind( SMESHOp::OpLength2D,              SMESH_Actor::eLength2D );
+    ActionControl.Bind( SMESHOp::OpConnection2D,          SMESH_Actor::eMultiConnection2D );
+    ActionControl.Bind( SMESHOp::OpArea,                  SMESH_Actor::eArea );
+    ActionControl.Bind( SMESHOp::OpTaper,                 SMESH_Actor::eTaper );
+    ActionControl.Bind( SMESHOp::OpAspectRatio,           SMESH_Actor::eAspectRatio );
+    ActionControl.Bind( SMESHOp::OpMinimumAngle,          SMESH_Actor::eMinimumAngle );
+    ActionControl.Bind( SMESHOp::OpWarpingAngle,          SMESH_Actor::eWarping );
+    ActionControl.Bind( SMESHOp::OpSkew,                  SMESH_Actor::eSkew );
+    ActionControl.Bind( SMESHOp::OpMaxElementLength2D,    SMESH_Actor::eMaxElementLength2D );
+    ActionControl.Bind( SMESHOp::OpEqualFace,             SMESH_Actor::eCoincidentElems2D );
+    ActionControl.Bind( SMESHOp::OpAspectRatio3D,         SMESH_Actor::eAspectRatio3D );
+    ActionControl.Bind( SMESHOp::OpVolume,                SMESH_Actor::eVolume3D );
+    ActionControl.Bind( SMESHOp::OpMaxElementLength3D,    SMESH_Actor::eMaxElementLength3D );
+    ActionControl.Bind( SMESHOp::OpBareBorderVolume,      SMESH_Actor::eBareBorderVolume );
+    ActionControl.Bind( SMESHOp::OpOverConstrainedVolume, SMESH_Actor::eOverConstrainedVolume );
+    ActionControl.Bind( SMESHOp::OpEqualVolume,           SMESH_Actor::eCoincidentElems3D );
+
+    return theReversed ? ActionControl.Find2( theID ) : ActionControl.Find1( theID );
+  }
+
   void Control( int theCommandID )
   {
-    SMESH_Actor::eControl aControl = SMESH_Actor::eNone;
-    switch ( theCommandID ){
-    case SMESHOp::OpFreeNode:
-      aControl = SMESH_Actor::eFreeNodes;
-      break;
-    case SMESHOp::OpEqualNode:
-      aControl = SMESH_Actor::eCoincidentNodes;
-      break;
-    case SMESHOp::OpFreeEdge:
-      aControl = SMESH_Actor::eFreeEdges;
-      break;
-    case SMESHOp::OpFreeBorder:
-      aControl = SMESH_Actor::eFreeBorders;
-      break;
-    case SMESHOp::OpLength:
-      aControl = SMESH_Actor::eLength;
-      break;
-    case SMESHOp::OpConnection:
-      aControl = SMESH_Actor::eMultiConnection;
-      break;
-    case SMESHOp::OpEqualEdge:
-      aControl = SMESH_Actor::eCoincidentElems1D;
-      break;
-    case SMESHOp::OpFreeFace:
-      aControl = SMESH_Actor::eFreeFaces;
-      break;
-    case SMESHOp::OpBareBorderFace:
-      aControl = SMESH_Actor::eBareBorderFace;
-      break;
-    case SMESHOp::OpOverConstrainedFace:
-      aControl = SMESH_Actor::eOverConstrainedFace;
-      break;
-    case SMESHOp::OpLength2D:
-      aControl = SMESH_Actor::eLength2D;
-      break;
-    case SMESHOp::OpConnection2D:
-      aControl = SMESH_Actor::eMultiConnection2D;
-      break;
-    case SMESHOp::OpArea:
-      aControl = SMESH_Actor::eArea;
-      break;
-    case SMESHOp::OpTaper:
-      aControl = SMESH_Actor::eTaper;
-      break;
-    case SMESHOp::OpAspectRatio:
-      aControl = SMESH_Actor::eAspectRatio;
-      break;
-    case SMESHOp::OpMinimumAngle:
-      aControl = SMESH_Actor::eMinimumAngle;
-      break;
-    case SMESHOp::OpWarpingAngle:
-      aControl = SMESH_Actor::eWarping;
-      break;
-    case SMESHOp::OpSkew:
-      aControl = SMESH_Actor::eSkew;
-      break;
-    case SMESHOp::OpMaxElementLength2D:
-      aControl = SMESH_Actor::eMaxElementLength2D;
-      break;
-    case SMESHOp::OpEqualFace:
-      aControl = SMESH_Actor:: eCoincidentElems2D;
-      break;
-    case SMESHOp::OpAspectRatio3D:
-      aControl = SMESH_Actor::eAspectRatio3D;
-      break;
-    case SMESHOp::OpVolume:
-      aControl = SMESH_Actor::eVolume3D;
-      break;
-    case SMESHOp::OpMaxElementLength3D:
-      aControl = SMESH_Actor::eMaxElementLength3D;
-      break;
-    case SMESHOp::OpBareBorderVolume:
-      aControl = SMESH_Actor::eBareBorderVolume;
-      break;
-    case SMESHOp::OpOverConstrainedVolume:
-      aControl = SMESH_Actor::eOverConstrainedVolume;
-      break;
-    case SMESHOp::OpEqualVolume:
-      aControl = SMESH_Actor::eCoincidentElems3D;
-      break;
-    }
+    SMESH_Actor::eControl aControl = SMESH_Actor::eControl( ActionToControl( theCommandID ));
     _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
-    LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
+
     SALOME_ListIO selected;
-    if( aSel )
+    if ( LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr() )
       aSel->selectedObjects( selected );
 
-    if( !selected.IsEmpty() ){
+    if ( !selected.IsEmpty() ) {
       SALOME_ListIteratorOfListIO It(selected);
       for ( ; It.More(); It.Next())
       {
         Handle(SALOME_InteractiveObject) anIO = It.Value();
-        if(!anIO.IsNull()){
+        if ( !anIO.IsNull() ) {
           _PTR(SObject) SO = aStudy->FindObjectID( It.Value()->getEntry() );
           if ( SO ) {
-            CORBA::Object_var aObject = SMESH::SObjectToObject( SO );
-            SMESH::SMESH_Mesh_var      aMesh    = SMESH::SMESH_Mesh::_narrow( aObject );
-            SMESH::SMESH_subMesh_var   aSubMesh = SMESH::SMESH_subMesh::_narrow( aObject );
-            SMESH::SMESH_GroupBase_var aGroup   = SMESH::SMESH_GroupBase::_narrow( aObject );
-            if ( !aMesh->_is_nil() || !aSubMesh->_is_nil() || !aGroup->_is_nil() ) {
-              if(SMESH_Actor *anActor = SMESH::FindActorByEntry(anIO->getEntry())) {
-                anActor->SetControlMode(aControl);
-                anActor->GetScalarBarActor()->SetTitle( functorToString( anActor->GetFunctor() ).toLatin1().constData() );
+            CORBA::Object_var         aObject = SMESH::SObjectToObject( SO );
+            SMESH::SMESH_IDSource_var anIDSrc = SMESH::SMESH_IDSource::_narrow( aObject );
+            if ( !anIDSrc->_is_nil() ) {
+              SMESH_Actor *anActor = SMESH::FindActorByEntry( anIO->getEntry());
+              if (( !anActor && selected.Extent() == 1 ) &&
+                  ( anActor = SMESH::CreateActor( aStudy, anIO->getEntry() )))
+              {
+                anActor->SetControlMode( aControl );
+                SMESH::DisplayActor( SMESH::GetCurrentVtkView(), anActor );
+                SMESH::UpdateView  ( SMESH::eDisplay, anIO->getEntry() );
+              }
+              if ( anActor )
+              {
+                if ( anActor->GetControlMode() != aControl )
+                  anActor->SetControlMode( aControl );
+                QString functorName = functorToString( anActor->GetFunctor() );
+                int anEntitiesCount = anActor->GetNumberControlEntities();
+                if (anEntitiesCount >= 0)
+                  functorName = functorName + ": " + QString::number(anEntitiesCount);
+                anActor->GetScalarBarActor()->SetTitle( functorName.toLatin1().constData() );
                 SMESH::RepaintCurrentView();
 #ifndef DISABLE_PLOT2DVIEWER
-                if(anActor->GetPlot2Histogram()) {
+                if ( anActor->GetPlot2Histogram() ) {
                   SPlot2d_Histogram* aHistogram = anActor->UpdatePlot2Histogram();
-                  QString functorName = functorToString( anActor->GetFunctor());
                   QString aHistogramName("%1 : %2");
-                  aHistogramName = aHistogramName.arg(anIO->getName()).arg(functorName);
-                  aHistogram->setName(aHistogramName);
-                  aHistogram->setHorTitle(functorName);
-                  SMESH::ProcessIn2DViewers(anActor);
+                  aHistogramName = aHistogramName.arg( anIO->getName() ).arg( functorName );
+                  aHistogram->setName( aHistogramName );
+                  aHistogram->setHorTitle( functorName );
+                  SMESH::ProcessIn2DViewers( anActor );
                 }
 #endif
               }
@@ -1704,13 +1722,13 @@ namespace
 
 
   bool CheckOIType(const Handle(SALOME_InteractiveObject) & theIO,
-                   SMESH::MeshObjectType                           theType,
+                   SMESH::MeshObjectType                    theType,
                    const QString                            theInTypeName,
                    QString &                                theOutTypeName)
   {
     SMESH_TypeFilter aTypeFilter( theType );
     QString entry;
-    if( !theIO.IsNull() )
+    if ( !theIO.IsNull() )
     {
       entry = theIO->getEntry();
       LightApp_DataOwner owner( entry );
@@ -1725,12 +1743,12 @@ namespace
 
   QString CheckTypeObject(const Handle(SALOME_InteractiveObject) & theIO)
   {
-    _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
+    _PTR(Study)  aStudy = SMESH::GetActiveStudyDocument();
     _PTR(SObject) aSObj = aStudy->FindObjectID(theIO->getEntry());
     if (aSObj) {
       _PTR(SComponent) aSComp = aSObj->GetFatherComponent();
-      CORBA::String_var anID = aSComp->GetID().c_str();
-      if (!strcmp(anID.in(),theIO->getEntry()))
+      CORBA::String_var  anID = aSComp->GetID().c_str();
+      if ( !strcmp(anID.in(),theIO->getEntry()) )
         return "Component";
     }
 
@@ -1748,26 +1766,25 @@ namespace
   }
 
 
-  QString CheckHomogeneousSelection()
-  {
-    //SUIT_Study* aStudy = SMESH::GetActiveStudy();
-    LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
-    SALOME_ListIO selected;
-    if( aSel )
-      aSel->selectedObjects( selected );
+  // QString CheckHomogeneousSelection()
+  // {
+  //   LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
+  //   SALOME_ListIO selected;
+  //   if ( aSel )
+  //     aSel->selectedObjects( selected );
 
-    QString RefType = CheckTypeObject(selected.First());
-    SALOME_ListIteratorOfListIO It(selected);
-    for ( ; It.More(); It.Next())
-    {
-      Handle(SALOME_InteractiveObject) IObject = It.Value();
-      QString Type = CheckTypeObject(IObject);
-      if (Type.compare(RefType) != 0)
-        return "Heterogeneous Selection";
-    }
+  //   QString RefType = CheckTypeObject(selected.First());
+  //   SALOME_ListIteratorOfListIO It(selected);
+  //   for ( ; It.More(); It.Next())
+  //   {
+  //     Handle(SALOME_InteractiveObject) IObject = It.Value();
+  //     QString Type = CheckTypeObject(IObject);
+  //     if ( Type.compare(RefType) != 0 )
+  //       return "Heterogeneous Selection";
+  //   }
 
-    return RefType;
-  }
+  //   return RefType;
+  // }
 
   uint randomize( uint size )
   {
@@ -1982,7 +1999,7 @@ SalomeApp_Module( "SMESH" )
   {
     CORBA::Boolean anIsEmbeddedMode;
     myComponentSMESH = SMESH_Client::GetSMESHGen(getApp()->orb(),anIsEmbeddedMode);
-    MESSAGE("-------------------------------> anIsEmbeddedMode=" << anIsEmbeddedMode);
+    //MESSAGE("-------------------------------> anIsEmbeddedMode=" << anIsEmbeddedMode);
 
     //  0019923: EDF 765 SMESH : default values of hypothesis
     SUIT_ResourceMgr* aResourceMgr = SMESH::GetResourceMgr(this);
@@ -1991,7 +2008,7 @@ SalomeApp_Module( "SMESH" )
     nbSeg = aResourceMgr->integerValue( "SMESH", "nb_segments_per_edge", 15 );
     myComponentSMESH->SetDefaultNbSegments( nbSeg );
 
-    const char* options[] = { "historical_python_dump", "forget_mesh_on_hyp_modif" };
+    const char* options[] = { "historical_python_dump", "forget_mesh_on_hyp_modif", "default_grp_color" };
     for ( size_t i = 0; i < sizeof(options)/sizeof(char*); ++i )
       if ( aResourceMgr->hasValue( "SMESH", options[i] ))
       {
@@ -2077,7 +2094,7 @@ bool SMESHGUI::automaticUpdate( SMESH::SMESH_IDSource_ptr theMesh,
   long nbEdges   = info[SMDSEntity_Edge] + info[SMDSEntity_Quad_Edge];
   long nbFaces   = info[SMDSEntity_Triangle]   + info[SMDSEntity_Quad_Triangle]   + info[SMDSEntity_BiQuad_Triangle] + 
                    info[SMDSEntity_Quadrangle] + info[SMDSEntity_Quad_Quadrangle] + info[SMDSEntity_BiQuad_Quadrangle] + 
-                   info[SMDSEntity_Polygon];
+                   info[SMDSEntity_Polygon] + info[SMDSEntity_Quad_Polygon];
   long nbVolumes = info[SMDSEntity_Tetra]   + info[SMDSEntity_Quad_Tetra] + 
                    info[SMDSEntity_Hexa]    + info[SMDSEntity_Quad_Hexa] + info[SMDSEntity_TriQuad_Hexa] + 
                    info[SMDSEntity_Pyramid] + info[SMDSEntity_Quad_Pyramid] + 
@@ -2260,6 +2277,26 @@ void SMESHGUI::EmitSignalVisibilityChanged()
   emit SignalVisibilityChanged();
 }
 
+//=============================================================================
+/*!
+ *
+ */
+//=============================================================================
+void SMESHGUI::EmitSignalCloseView()
+{
+  emit SignalCloseView();
+}
+
+//=============================================================================
+/*!
+ *
+ */
+//=============================================================================
+void SMESHGUI::EmitSignalActivatedViewManager()
+{
+  emit SignalActivatedViewManager();
+}
+
 //=============================================================================
 /*!
  *
@@ -2464,8 +2501,9 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       if( aSel )
         aSel->selectedObjects( selected );
 
-      if( selected.Extent() ) {
-        Handle(SALOME_InteractiveObject) anIO = selected.First();
+      SALOME_ListIteratorOfListIO it(selected);
+      for( ; it.More(); it.Next()) {
+        Handle(SALOME_InteractiveObject) anIO = it.Value();
         if( anIO->hasEntry() ) {
           if( SMESH_Actor* anActor = SMESH::FindActorByEntry( anIO->getEntry() ) ) {
             anActor->SetControlMode( SMESH_Actor::eNone );
@@ -2475,6 +2513,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
           }
         }
       }
+      SMESH::UpdateView();
       break;
     }
   case SMESHOp::OpScalarBarProperties:
@@ -2482,6 +2521,12 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       SMESHGUI_Preferences_ScalarBarDlg::ScalarBarProperties( this );
       break;
     }
+  case SMESHOp::OpShowScalarBar:
+    {
+      // show/hide scalar bar
+      ::ShowElement(theCommandID);
+      break;
+    }
   case SMESHOp::OpSaveDistribution:
     {
       // dump control distribution data to the text file
@@ -2491,8 +2536,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
 
   case SMESHOp::OpShowDistribution:
     {
-      // show/ distribution
-      ::ShowDistribution();
+      // show/hide distribution
+      ::ShowElement(theCommandID);
       break;
     }
 
@@ -2594,10 +2639,11 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
   case SMESHOp::OpShow:
   case SMESHOp::OpShowOnly:
     {
+      SUIT_OverrideCursor wc;
       SMESH::EDisplaing anAction;
       switch (theCommandID) {
-      case SMESHOp::OpHide: anAction = SMESH::eErase; break;
-      case SMESHOp::OpShow: anAction = SMESH::eDisplay; break;
+      case SMESHOp::OpHide:     anAction = SMESH::eErase; break;
+      case SMESHOp::OpShow:     anAction = SMESH::eDisplay; break;
       case SMESHOp::OpShowOnly: anAction = SMESH::eDisplayOnly; break;
       }
 
@@ -2606,9 +2652,9 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       if (aSel)
         aSel->selectedObjects( sel_objects );
 
-      if( theCommandID==SMESHOp::OpShowOnly )
+      if ( theCommandID==SMESHOp::OpShowOnly )
       {
-        MESSAGE("anAction = SMESH::eDisplayOnly");
+        //MESSAGE("anAction = SMESH::eDisplayOnly");
         startOperation( myEraseAll );
       }
 
@@ -2620,27 +2666,23 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
 #endif
         if (vtkwnd) {
           SALOME_ListIteratorOfListIO It( to_process );
-          for ( ; It.More(); It.Next()) {
-            MESSAGE("---");
+          for ( ; It.More(); It.Next())
+          {
             Handle(SALOME_InteractiveObject) IOS = It.Value();
-            if (IOS->hasEntry()) {
-              MESSAGE("---");
-              if (!SMESH::UpdateView(anAction, IOS->getEntry())) {
+            if ( IOS->hasEntry() )
+            {
+              if ( !SMESH::UpdateView( anAction, IOS->getEntry() )) {
                 SMESHGUI::GetSMESHGUI()->EmitSignalVisibilityChanged();
                 break; // PAL16774 (Crash after display of many groups)
               }
               if (anAction == SMESH::eDisplayOnly)
-              {
-                MESSAGE("anAction = SMESH::eDisplayOnly");
                 anAction = SMESH::eDisplay;
-              }
             }
           }
         }
 
         // PAL13338 + PAL15161 -->
         if ( ( theCommandID==SMESHOp::OpShow || theCommandID==SMESHOp::OpShowOnly ) && !checkLock(aStudy)) {
-          MESSAGE("anAction = SMESH::eDisplayOnly");
           SMESH::UpdateView();
           SMESHGUI::GetSMESHGUI()->EmitSignalVisibilityChanged();
         }
@@ -2651,7 +2693,6 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       }
 
       if (anAction == SMESH::eErase) {
-        MESSAGE("anAction == SMESH::eErase");
         SALOME_ListIO l1;
         aSel->setSelectedObjects( l1 );
       }
@@ -2671,9 +2712,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
         ( new SMESHGUI_NodesDlg( this ) )->show();
       }
       else {
-        SUIT_MessageBox::warning(desktop(),
-                                 tr("SMESH_WRN_WARNING"),
-                                 tr("SMESH_WRN_VIEWER_VTK"));
+        SUIT_MessageBox::warning(desktop(),tr("SMESH_WRN_WARNING"),tr("SMESH_WRN_VIEWER_VTK"));
       }
       break;
     }
@@ -2681,7 +2720,10 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
   case SMESHOp::OpCreateMesh:
   case SMESHOp::OpCreateSubMesh:
   case SMESHOp::OpEditMeshOrSubMesh:
+  case SMESHOp::OpEditMesh:
+  case SMESHOp::OpEditSubMesh:
   case SMESHOp::OpCompute:
+  case SMESHOp::OpComputeSubMesh:
   case SMESHOp::OpPreCompute:
   case SMESHOp::OpEvaluate:
   case SMESHOp::OpMeshOrder:
@@ -2707,8 +2749,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
     {
       if ( !vtkwnd )
       {
-        SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),
-                                  tr( "NOT_A_VTK_VIEWER" ) );
+        SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ), tr( "NOT_A_VTK_VIEWER" ) );
         break;
       }
 
@@ -2738,8 +2779,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
     {
       if ( !vtkwnd )
       {
-        SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),
-                                  tr( "NOT_A_VTK_VIEWER" ) );
+        SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ), tr( "NOT_A_VTK_VIEWER" ) );
         break;
       }
 
@@ -2768,8 +2808,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
         ( new SMESHGUI_SmoothingDlg( this ) )->show();
       }
       else {
-        SUIT_MessageBox::warning(desktop(),
-                                 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
+        SUIT_MessageBox::warning(desktop(), tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
       }
       break;
     }
@@ -2780,8 +2819,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
         EmitSignalDeactivateDialog();
         ( new SMESHGUI_ExtrusionDlg ( this ) )->show();
       } else {
-        SUIT_MessageBox::warning(desktop(),
-                                 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
+        SUIT_MessageBox::warning(desktop(),tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
       }
       break;
     }
@@ -2792,8 +2830,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
         EmitSignalDeactivateDialog();
         ( new SMESHGUI_ExtrusionAlongPathDlg( this ) )->show();
       } else {
-        SUIT_MessageBox::warning(desktop(),
-                                 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
+        SUIT_MessageBox::warning(desktop(),tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
       }
       break;
     }
@@ -2805,8 +2842,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
         ( new SMESHGUI_RevolutionDlg( this ) )->show();
       }
       else {
-        SUIT_MessageBox::warning(desktop(),
-                                 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
+        SUIT_MessageBox::warning(desktop(),tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
       }
       break;
     }
@@ -2820,11 +2856,11 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
         ( new SMESHGUI_MeshPatternDlg( this ) )->show();
       }
       else {
-        SUIT_MessageBox::warning(desktop(),
-                                 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
+        SUIT_MessageBox::warning(desktop(),tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
       }
       break;
     }
+  case SMESHOp::OpSplitBiQuadratic:
   case SMESHOp::OpConvertMeshToQuadratic:
   case SMESHOp::OpCreateBoundaryElements: // create 2D mesh from 3D
   case SMESHOp::OpReorientFaces:
@@ -2837,8 +2873,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
     {
       if ( !vtkwnd )
       {
-        SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),
-                                  tr( "NOT_A_VTK_VIEWER" ) );
+        SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),tr( "NOT_A_VTK_VIEWER" ) );
         break;
       }
 
@@ -2865,8 +2900,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
     {
       if ( !vtkwnd )
       {
-        SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),
-                                  tr( "NOT_A_VTK_VIEWER" ) );
+        SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),tr( "NOT_A_VTK_VIEWER" ) );
         break;
       }
 
@@ -2943,8 +2977,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
     {
       if ( !vtkwnd )
       {
-        SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),
-                                  tr( "NOT_A_VTK_VIEWER" ) );
+        SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),tr( "NOT_A_VTK_VIEWER" ) );
         break;
       }
 
@@ -3000,8 +3033,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
     {
       if ( !vtkwnd )
       {
-        SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),
-                                  tr( "NOT_A_VTK_VIEWER" ) );
+        SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),tr( "NOT_A_VTK_VIEWER" ) );
         break;
       }
 
@@ -3041,8 +3073,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
     {
       if ( !vtkwnd )
       {
-        SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),
-                                  tr( "NOT_A_VTK_VIEWER" ) );
+        SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),tr( "NOT_A_VTK_VIEWER" ) );
         break;
       }
 
@@ -3080,8 +3111,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
     {
       if ( !vtkwnd )
       {
-        SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),
-                                  tr( "NOT_A_VTK_VIEWER" ) );
+        SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),tr( "NOT_A_VTK_VIEWER" ) );
         break;
       }
 
@@ -3223,8 +3253,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
         ( new SMESHGUI_AddMeshElementDlg( this, type ) )->show();
       }
       else {
-        SUIT_MessageBox::warning(desktop(),
-                                 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
+        SUIT_MessageBox::warning(desktop(),tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
       }
       break;
     }
@@ -3236,8 +3265,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
         ( new SMESHGUI_CreatePolyhedralVolumeDlg( this ) )->show();
       }
       else {
-        SUIT_MessageBox::warning(SMESHGUI::desktop(),
-                                 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
+        SUIT_MessageBox::warning(desktop(),tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
       }
       break;
     }
@@ -3246,6 +3274,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
   case SMESHOp::OpBiQuadraticTriangle:
   case SMESHOp::OpQuadraticQuadrangle:
   case SMESHOp::OpBiQuadraticQuadrangle:
+  case SMESHOp::OpQuadraticPolygon:
   case SMESHOp::OpQuadraticTetrahedron:
   case SMESHOp::OpQuadraticPyramid:
   case SMESHOp::OpQuadraticPentahedron:
@@ -3258,15 +3287,16 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
         SMDSAbs_EntityType type = SMDSEntity_Last;
 
         switch (theCommandID) {
-        case SMESHOp::OpQuadraticEdge: type = SMDSEntity_Quad_Edge; break;
-        case SMESHOp::OpQuadraticTriangle: type = SMDSEntity_Quad_Triangle; break;
-        case SMESHOp::OpBiQuadraticTriangle: type = SMDSEntity_BiQuad_Triangle; break;
-        case SMESHOp::OpQuadraticQuadrangle: type = SMDSEntity_Quad_Quadrangle; break;
-        case SMESHOp::OpBiQuadraticQuadrangle: type = SMDSEntity_BiQuad_Quadrangle; break;
-        case SMESHOp::OpQuadraticTetrahedron: type = SMDSEntity_Quad_Tetra; break;
-        case SMESHOp::OpQuadraticPyramid: type = SMDSEntity_Quad_Pyramid; break;
-        case SMESHOp::OpQuadraticPentahedron: type = SMDSEntity_Quad_Penta; break;
-        case SMESHOp::OpQuadraticHexahedron: type = SMDSEntity_Quad_Hexa; break;
+        case SMESHOp::OpQuadraticEdge:          type = SMDSEntity_Quad_Edge; break;
+        case SMESHOp::OpQuadraticTriangle:      type = SMDSEntity_Quad_Triangle; break;
+        case SMESHOp::OpBiQuadraticTriangle:    type = SMDSEntity_BiQuad_Triangle; break;
+        case SMESHOp::OpQuadraticQuadrangle:    type = SMDSEntity_Quad_Quadrangle; break;
+        case SMESHOp::OpBiQuadraticQuadrangle:  type = SMDSEntity_BiQuad_Quadrangle; break;
+        case SMESHOp::OpQuadraticPolygon:       type = SMDSEntity_Quad_Polygon; break;
+        case SMESHOp::OpQuadraticTetrahedron:   type = SMDSEntity_Quad_Tetra; break;
+        case SMESHOp::OpQuadraticPyramid:       type = SMDSEntity_Quad_Pyramid; break;
+        case SMESHOp::OpQuadraticPentahedron:   type = SMDSEntity_Quad_Penta; break;
+        case SMESHOp::OpQuadraticHexahedron:    type = SMDSEntity_Quad_Hexa; break;
         case SMESHOp::OpTriQuadraticHexahedron: type = SMDSEntity_TriQuad_Hexa; break;
         default: break;
         }
@@ -3811,9 +3841,12 @@ void SMESHGUI::initialize( CAM_Application* app )
   createSMESHAction( SMESHOp::OpCreateMesh,           "CREATE_MESH",             "ICON_DLG_INIT_MESH" );
   createSMESHAction( SMESHOp::OpCreateSubMesh,        "CREATE_SUBMESH",          "ICON_DLG_ADD_SUBMESH" );
   createSMESHAction( SMESHOp::OpEditMeshOrSubMesh,    "EDIT_MESHSUBMESH",        "ICON_DLG_EDIT_MESH" );
+  createSMESHAction( SMESHOp::OpEditMesh,             "EDIT_MESH",               "ICON_DLG_EDIT_MESH" );
+  createSMESHAction( SMESHOp::OpEditSubMesh,          "EDIT_SUBMESH",            "ICON_DLG_EDIT_MESH" );
   createSMESHAction( SMESHOp::OpBuildCompoundMesh,    "BUILD_COMPOUND",          "ICON_BUILD_COMPOUND" );
   createSMESHAction( SMESHOp::OpCopyMesh,             "COPY_MESH",               "ICON_COPY_MESH" );
   createSMESHAction( SMESHOp::OpCompute,              "COMPUTE",                 "ICON_COMPUTE" );
+  createSMESHAction( SMESHOp::OpComputeSubMesh,        "COMPUTE_SUBMESH",         "ICON_COMPUTE" );
   createSMESHAction( SMESHOp::OpPreCompute,           "PRECOMPUTE",              "ICON_PRECOMPUTE" );
   createSMESHAction( SMESHOp::OpEvaluate,             "EVALUATE",                "ICON_EVALUATE" );
   createSMESHAction( SMESHOp::OpMeshOrder,            "MESH_ORDER",              "ICON_MESH_ORDER");
@@ -3881,6 +3914,7 @@ void SMESHGUI::initialize( CAM_Application* app )
   createSMESHAction( SMESHOp::OpBiQuadraticTriangle,    "BIQUADRATIC_TRIANGLE",    "ICON_DLG_BIQUADRATIC_TRIANGLE" );
   createSMESHAction( SMESHOp::OpQuadraticQuadrangle,    "QUADRATIC_QUADRANGLE",    "ICON_DLG_QUADRATIC_QUADRANGLE" );
   createSMESHAction( SMESHOp::OpBiQuadraticQuadrangle,  "BIQUADRATIC_QUADRANGLE",  "ICON_DLG_BIQUADRATIC_QUADRANGLE" );
+  createSMESHAction( SMESHOp::OpQuadraticPolygon,       "QUADRATIC_POLYGON",       "ICON_DLG_QUADRATIC_POLYGON" );
   createSMESHAction( SMESHOp::OpQuadraticTetrahedron,   "QUADRATIC_TETRAHEDRON",   "ICON_DLG_QUADRATIC_TETRAHEDRON" );
   createSMESHAction( SMESHOp::OpQuadraticPyramid,       "QUADRATIC_PYRAMID",       "ICON_DLG_QUADRATIC_PYRAMID" );
   createSMESHAction( SMESHOp::OpQuadraticPentahedron,   "QUADRATIC_PENTAHEDRON",   "ICON_DLG_QUADRATIC_PENTAHEDRON" );
@@ -3911,6 +3945,7 @@ void SMESHGUI::initialize( CAM_Application* app )
   createSMESHAction( SMESHOp::OpUnionOfTriangles,       "UNION",           "ICON_UNIONTRI" );
   createSMESHAction( SMESHOp::OpCuttingOfQuadrangles,   "CUT",             "ICON_CUTQUAD" );
   createSMESHAction( SMESHOp::OpSplitVolumes,           "SPLIT_TO_TETRA",  "ICON_SPLIT_TO_TETRA" );
+  createSMESHAction( SMESHOp::OpSplitBiQuadratic,       "SPLIT_BIQUAD",    "ICON_SPLIT_BIQUAD" );
   createSMESHAction( SMESHOp::OpSmoothing,              "SMOOTH",          "ICON_DLG_SMOOTHING" );
   createSMESHAction( SMESHOp::OpExtrusion,              "EXTRUSION",       "ICON_EXTRUSION" );
   createSMESHAction( SMESHOp::OpExtrusionAlongAPath,    "EXTRUSION_ALONG", "ICON_EXTRUSION_ALONG" );
@@ -3921,6 +3956,7 @@ void SMESHGUI::initialize( CAM_Application* app )
 
   createSMESHAction( SMESHOp::OpReset,               "RESET" );
   createSMESHAction( SMESHOp::OpScalarBarProperties, "SCALAR_BAR_PROP" );
+  createSMESHAction( SMESHOp::OpShowScalarBar,       "SHOW_SCALAR_BAR","",0, true  );
   createSMESHAction( SMESHOp::OpSaveDistribution,    "SAVE_DISTRIBUTION" );
   createSMESHAction( SMESHOp::OpShowDistribution,    "SHOW_DISTRIBUTION","",0, true );
 #ifndef DISABLE_PLOT2DVIEWER
@@ -3994,12 +4030,14 @@ void SMESHGUI::initialize( CAM_Application* app )
 
   createMenu( separator(), fileId );
 
+  QMenu* nodeMenu = new QMenu(); QMenu* edgeMenu = new QMenu();
+  QMenu* faceMenu = new QMenu(); QMenu* volumeMenu = new QMenu();
   int importId = createMenu( tr( "MEN_IMPORT" ), fileId, -1, 10 ),
       exportId = createMenu( tr( "MEN_EXPORT" ), fileId, -1, 10 ),
-      nodeId   = createMenu( tr( "MEN_NODE_CTRL" ), ctrlId, -1, 10 ),
-      edgeId   = createMenu( tr( "MEN_EDGE_CTRL" ), ctrlId, -1, 10 ),
-      faceId   = createMenu( tr( "MEN_FACE_CTRL" ), ctrlId, -1, 10 ),
-      volumeId = createMenu( tr( "MEN_VOLUME_CTRL" ), ctrlId, -1, 10 ),
+      nodeId   = createMenu( tr( "MEN_NODE_CTRL" ), ctrlId, -1, 10, -1, nodeMenu ),
+      edgeId   = createMenu( tr( "MEN_EDGE_CTRL" ), ctrlId, -1, 10, -1, edgeMenu ),
+      faceId   = createMenu( tr( "MEN_FACE_CTRL" ), ctrlId, -1, 10, -1, faceMenu ),
+      volumeId = createMenu( tr( "MEN_VOLUME_CTRL" ), ctrlId, -1, 10, -1, volumeMenu ),
       addId    = createMenu( tr( "MEN_ADD" ),    modifyId, 402 ),
       removeId = createMenu( tr( "MEN_REMOVE" ), modifyId, 403 ),
     //renumId  = createMenu( tr( "MEN_RENUM" ),  modifyId, 404 ),
@@ -4061,11 +4099,11 @@ void SMESHGUI::initialize( CAM_Application* app )
 
   createMenu( SMESHOp::OpFreeNode,              nodeId,   -1 );
   createMenu( SMESHOp::OpEqualNode,             nodeId,   -1 );
-  createMenu( SMESHOp::OpFreeEdge,              edgeId,   -1 );
   createMenu( SMESHOp::OpFreeBorder,            edgeId,   -1 );
   createMenu( SMESHOp::OpLength,                edgeId,   -1 );
   createMenu( SMESHOp::OpConnection,            edgeId,   -1 );
   createMenu( SMESHOp::OpEqualEdge,             edgeId,   -1 );
+  createMenu( SMESHOp::OpFreeEdge,              faceId,   -1 );
   createMenu( SMESHOp::OpFreeFace,              faceId,   -1 );
   createMenu( SMESHOp::OpBareBorderFace,        faceId,   -1 );
   createMenu( SMESHOp::OpOverConstrainedFace,   faceId,   -1 );
@@ -4110,6 +4148,7 @@ void SMESHGUI::initialize( CAM_Application* app )
   createMenu( SMESHOp::OpBiQuadraticTriangle ,   addId, -1 );
   createMenu( SMESHOp::OpQuadraticQuadrangle,    addId, -1 );
   createMenu( SMESHOp::OpBiQuadraticQuadrangle,  addId, -1 );
+  createMenu( SMESHOp::OpQuadraticPolygon,       addId, -1 );
   createMenu( SMESHOp::OpQuadraticTetrahedron,   addId, -1 );
   createMenu( SMESHOp::OpQuadraticPyramid,       addId, -1 );
   createMenu( SMESHOp::OpQuadraticPentahedron,   addId, -1 );
@@ -4144,6 +4183,7 @@ void SMESHGUI::initialize( CAM_Application* app )
   createMenu( SMESHOp::OpUnionOfTriangles,       modifyId, -1 );
   createMenu( SMESHOp::OpCuttingOfQuadrangles,   modifyId, -1 );
   createMenu( SMESHOp::OpSplitVolumes,           modifyId, -1 );
+  createMenu( SMESHOp::OpSplitBiQuadratic,       modifyId, -1 );
   createMenu( SMESHOp::OpSmoothing,              modifyId, -1 );
   createMenu( SMESHOp::OpExtrusion,              modifyId, -1 );
   createMenu( SMESHOp::OpExtrusionAlongAPath ,   modifyId, -1 );
@@ -4159,6 +4199,11 @@ void SMESHGUI::initialize( CAM_Application* app )
   createMenu( SMESHOp::OpPropertiesVolume, basicPropId, -1 );
   createMenu( SMESHOp::OpUpdate,           viewId,      -1 );
 
+  connect( nodeMenu,   SIGNAL( aboutToShow() ), this, SLOT( onUpdateControlActions() ) );
+  connect( edgeMenu,   SIGNAL( aboutToShow() ), this, SLOT( onUpdateControlActions() ) );
+  connect( faceMenu,   SIGNAL( aboutToShow() ), this, SLOT( onUpdateControlActions() ) );
+  connect( volumeMenu, SIGNAL( aboutToShow() ), this, SLOT( onUpdateControlActions() ) );
+
   // ----- create toolbars --------------
   int meshTb       = createTool( tr( "TB_MESH" ),      QString( "SMESHMeshToolbar" ) ),
       info         = createTool( tr( "TB_INFO" ),      QString( "SMESHInformationToolbar" ) ),
@@ -4200,12 +4245,12 @@ void SMESHGUI::initialize( CAM_Application* app )
   createTool( SMESHOp::OpFreeNode,  ctrl0dTb );
   createTool( SMESHOp::OpEqualNode, ctrl0dTb );
 
-  createTool( SMESHOp::OpFreeEdge,   ctrl1dTb );
   createTool( SMESHOp::OpFreeBorder, ctrl1dTb );
   createTool( SMESHOp::OpLength,     ctrl1dTb );
   createTool( SMESHOp::OpConnection, ctrl1dTb );
   createTool( SMESHOp::OpEqualEdge,  ctrl1dTb );
 
+  createTool( SMESHOp::OpFreeEdge,            ctrl2dTb );
   createTool( SMESHOp::OpFreeFace,            ctrl2dTb );
   createTool( SMESHOp::OpBareBorderFace,      ctrl2dTb );
   createTool( SMESHOp::OpOverConstrainedFace, ctrl2dTb );
@@ -4247,6 +4292,7 @@ void SMESHGUI::initialize( CAM_Application* app )
   createTool( SMESHOp::OpBiQuadraticTriangle,    addNonElemTb );
   createTool( SMESHOp::OpQuadraticQuadrangle,    addNonElemTb );
   createTool( SMESHOp::OpBiQuadraticQuadrangle,  addNonElemTb );
+  createTool( SMESHOp::OpQuadraticPolygon,       addNonElemTb );
   createTool( SMESHOp::OpQuadraticTetrahedron,   addNonElemTb );
   createTool( SMESHOp::OpQuadraticPyramid,       addNonElemTb );
   createTool( SMESHOp::OpQuadraticPentahedron,   addNonElemTb );
@@ -4278,6 +4324,7 @@ void SMESHGUI::initialize( CAM_Application* app )
   createTool( SMESHOp::OpUnionOfTriangles,       modifyTb );
   createTool( SMESHOp::OpCuttingOfQuadrangles,   modifyTb );
   createTool( SMESHOp::OpSplitVolumes,           modifyTb );
+  createTool( SMESHOp::OpSplitBiQuadratic,       modifyTb );
   createTool( SMESHOp::OpSmoothing,              modifyTb );
   createTool( SMESHOp::OpExtrusion,              modifyTb );
   createTool( SMESHOp::OpExtrusionAlongAPath,    modifyTb );
@@ -4294,24 +4341,26 @@ void SMESHGUI::initialize( CAM_Application* app )
   QString dc = "selcount"; // VSR : instead of QtxPopupSelection::defSelCountParam()
 
   myRules.clear();
-  QString OB = "'ObjectBrowser'",
-          View = "'" + SVTK_Viewer::Type() + "'",
-          pat = "'%1'",
-          mesh    = pat.arg( SMESHGUI_Selection::typeName( SMESH::MESH ) ),
-          group   = pat.arg( SMESHGUI_Selection::typeName( SMESH::GROUP ) ),
-          hypo    = pat.arg( SMESHGUI_Selection::typeName( SMESH::HYPOTHESIS ) ),
-          algo    = pat.arg( SMESHGUI_Selection::typeName( SMESH::ALGORITHM ) ),
-          elems   = QString( "'%1' '%2' '%3' '%4' '%5' '%6'" ).
-                       arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_VERTEX ) ).
-                       arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_EDGE ) ).
-                       arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_FACE ) ).
-                       arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_SOLID ) ).
-                       arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_COMPOUND ) ).
-                       arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH ) ),
-          subMesh = elems,
-          mesh_part = mesh + " " + subMesh + " " + group,
-          mesh_group = mesh + " " + group,
-          hyp_alg = hypo + " " + algo;
+  QString
+    OB      = "'ObjectBrowser'",
+    View    = "'" + SVTK_Viewer::Type() + "'",
+    pat     = "'%1'",
+    mesh    = pat.arg( SMESHGUI_Selection::typeName( SMESH::MESH ) ),
+    group   = pat.arg( SMESHGUI_Selection::typeName( SMESH::GROUP ) ),
+    hypo    = pat.arg( SMESHGUI_Selection::typeName( SMESH::HYPOTHESIS ) ),
+    algo    = pat.arg( SMESHGUI_Selection::typeName( SMESH::ALGORITHM ) ),
+    elems   = QString( "'%1' '%2' '%3' '%4' '%5' '%6'" ).
+    arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_VERTEX ) ).
+    arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_EDGE ) ).
+    arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_FACE ) ).
+    arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_SOLID ) ).
+    arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_COMPOUND ) ).
+    arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH ) ),
+    subMesh      = elems,
+    mesh_part    = mesh + " " + subMesh + " " + group,
+    mesh_group   = mesh + " " + group,
+    mesh_submesh = mesh + " " + subMesh,
+    hyp_alg      = hypo + " " + algo;
 
   // popup for object browser
   QString
@@ -4327,38 +4376,39 @@ void SMESHGUI::initialize( CAM_Application* app )
     hasElems0d("({'Elem0d'} in elemTypes)"),
     hasEdges("({'Edge'} in elemTypes)"),
     hasFaces("({'Face'} in elemTypes)"),
-    hasVolumes("({'Volume'} in elemTypes)");
-
-  createPopupItem( SMESHOp::OpFileInformation,      OB, mesh, "&& selcount=1 && isImported" );
-  createPopupItem( SMESHOp::OpCreateSubMesh,        OB, mesh, "&& isComputable");
-  createPopupItem( SMESHOp::OpEditMeshOrSubMesh,    OB, mesh, "&& isComputable");
-  createPopupItem( SMESHOp::OpEditMeshOrSubMesh,    OB, subMesh, "&& isComputable" );
-  createPopupItem( SMESHOp::OpEditGroup,            OB, group );
+    hasVolumes("({'Volume'} in elemTypes)"),
+    hasFacesOrVolumes("(({'Face'} in elemTypes) || ({'Volume'} in elemTypes)) ");
+
+  createPopupItem( SMESHOp::OpFileInformation,   OB, mesh, "&& selcount=1 && isImported" );
+  createPopupItem( SMESHOp::OpCreateSubMesh,     OB, mesh, "&& hasGeomReference");
+  createPopupItem( SMESHOp::OpEditMesh,          OB, mesh, "&& selcount=1" );
+  createPopupItem( SMESHOp::OpEditSubMesh,       OB, subMesh, "&& selcount=1 && hasGeomReference" );
+  createPopupItem( SMESHOp::OpEditGroup,         OB, group );
   createPopupItem( SMESHOp::OpEditGeomGroupAsGroup, OB, group, "&& groupType != 'Group'" );
 
   popupMgr()->insert( separator(), -1, 0 );
-  createPopupItem( SMESHOp::OpCompute,                OB, mesh, "&& isComputable" );
-  createPopupItem( SMESHOp::OpPreCompute,             OB, mesh, "&& isComputable && isPreComputable" );
-  createPopupItem( SMESHOp::OpEvaluate,               OB, mesh, "&& isComputable" );
-  createPopupItem( SMESHOp::OpMeshOrder,              OB, mesh, "&& isComputable" );
-  createPopupItem( SMESHOp::OpUpdate,                 OB, mesh_part );
-  createPopupItem( SMESHOp::OpMeshInformation,        OB, mesh_part );
-  createPopupItem( SMESHOp::OpFindElementByPoint,     OB, mesh_group );
-  createPopupItem( SMESHOp::OpOverallMeshQuality,     OB, mesh_part );
+  createPopupItem( SMESHOp::OpCompute,           OB, mesh, "&& selcount=1 && isComputable" );
+  createPopupItem( SMESHOp::OpComputeSubMesh,    OB, subMesh, "&& selcount=1 && isComputable" );
+  createPopupItem( SMESHOp::OpPreCompute,        OB, mesh, "&& selcount=1 && isPreComputable" );
+  createPopupItem( SMESHOp::OpEvaluate,          OB, mesh, "&& selcount=1 && isComputable" );
+  createPopupItem( SMESHOp::OpMeshOrder,         OB, mesh, "&& selcount=1 && isComputable && hasGeomReference" );
+  createPopupItem( SMESHOp::OpUpdate,            OB, mesh_part );
+  createPopupItem( SMESHOp::OpMeshInformation,   OB, mesh_part );
+  createPopupItem( SMESHOp::OpFindElementByPoint,OB, mesh_group, "&& selcount=1" );
+  createPopupItem( SMESHOp::OpOverallMeshQuality,OB, mesh_part );
   popupMgr()->insert( separator(), -1, 0 );
-  createPopupItem( SMESHOp::OpCreateGroup,            OB, mesh );
-  createPopupItem( SMESHOp::OpCreateGeometryGroup,    OB, mesh );
-  createPopupItem( SMESHOp::OpConstructGroup,         OB, subMesh );
+  createPopupItem( SMESHOp::OpCreateGroup,       OB, mesh, "&& selcount=1" );
+  createPopupItem( SMESHOp::OpCreateGeometryGroup, OB, mesh, "&& selcount=1 && hasGeomReference" );
+  createPopupItem( SMESHOp::OpConstructGroup,    OB, subMesh );
   popupMgr()->insert( separator(), -1, 0 );
-  createPopupItem( SMESHOp::OpEditHypothesis,         OB, hypo);
-  createPopupItem( SMESHOp::OpUnassign,               OB, hyp_alg );     // REMOVE HYPOTHESIS / ALGORITHMS
+  createPopupItem( SMESHOp::OpEditHypothesis,    OB, hypo, "&& isEditableHyp");
+  createPopupItem( SMESHOp::OpUnassign,          OB, hyp_alg );
   popupMgr()->insert( separator(), -1, 0 );
-  createPopupItem( SMESHOp::OpClearMesh,              OB, mesh );
-  popupMgr()->insert( separator(), -1, 0 );
-  createPopupItem( SMESHOp::OpConvertMeshToQuadratic, OB, mesh + " " + subMesh );  // convert to quadratic
-  createPopupItem( SMESHOp::OpCreateBoundaryElements, OB, mesh + " " + group,      // create 2D mesh from 3D
-                   "&& dim>=2");
+  createPopupItem( SMESHOp::OpConvertMeshToQuadratic, OB, mesh_submesh );
+  createPopupItem( SMESHOp::OpCreateBoundaryElements, OB, mesh_group, "&& selcount=1 && dim>=2");
   popupMgr()->insert( separator(), -1, 0 );
+  createPopupItem( SMESHOp::OpClearMesh,              OB, mesh );
+  //popupMgr()->insert( separator(), -1, 0 );
 
   QString only_one_non_empty = QString( " && %1=1 && numberOfNodes>0" ).arg( dc );
   QString multiple_non_empty = QString( " && %1>0 && numberOfNodes>0" ).arg( dc );
@@ -4371,9 +4421,9 @@ void SMESHGUI::initialize( CAM_Application* app )
 #ifdef WITH_CGNS
   createPopupItem( SMESHOp::OpPopupExportCGNS, OB, mesh_group, multiple_non_empty, anId );
 #endif
-  createPopupItem( SMESHOp::OpPopupExportSAUV, OB, mesh_group, multiple_non_empty, anId );
-  createPopupItem( SMESHOp::OpPopupExportGMF,  OB, mesh_group, multiple_non_empty, anId );
-  createPopupItem( SMESHOp::OpPopupExportDAT,  OB, mesh_group, multiple_non_empty, anId );
+  createPopupItem( SMESHOp::OpPopupExportSAUV, OB, mesh_group, only_one_non_empty, anId );
+  createPopupItem( SMESHOp::OpPopupExportGMF,  OB, mesh_group, only_one_non_empty, anId );
+  createPopupItem( SMESHOp::OpPopupExportDAT,  OB, mesh_group, only_one_non_empty, anId );
   createPopupItem( SMESHOp::OpDelete,          OB, mesh_part + " " + hyp_alg );
   createPopupItem( SMESHOp::OpDeleteGroup,     OB, group );
   popupMgr()->insert( separator(), -1, 0 );
@@ -4484,11 +4534,11 @@ void SMESHGUI::initialize( CAM_Application* app )
   //-------------------------------------------------
   anId = popupMgr()->insert( tr( "MEN_QUADRATIC_REPRESENT" ), -1, -1 );
   popupMgr()->insert( action( SMESHOp::OpRepresentationLines ), anId, -1 );
-  popupMgr()->setRule( action( SMESHOp::OpRepresentationLines ), aMeshInVTK + "and isVisible",QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( SMESHOp::OpRepresentationLines ), aMeshInVTK + "&& isVisible && isQuadratic",QtxPopupMgr::VisibleRule );
   popupMgr()->setRule( action( SMESHOp::OpRepresentationLines ), "quadratic2DMode = 'eLines'", QtxPopupMgr::ToggleRule );
 
   popupMgr()->insert( action( SMESHOp::OpRepresentationArcs ), anId, -1 );
-  popupMgr()->setRule( action( SMESHOp::OpRepresentationArcs ), aMeshInVTK + "and isVisible", QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( SMESHOp::OpRepresentationArcs ), aMeshInVTK + "&& isVisible && isQuadratic", QtxPopupMgr::VisibleRule );
   popupMgr()->setRule( action( SMESHOp::OpRepresentationArcs ), "quadratic2DMode = 'eArcs'", QtxPopupMgr::ToggleRule );
 
   //-------------------------------------------------
@@ -4538,12 +4588,8 @@ void SMESHGUI::initialize( CAM_Application* app )
 
   aSubId = popupMgr()->insert( tr( "MEN_EDGE_CTRL" ), anId, -1 ); // EDGE CONTROLS
 
-  popupMgr()->insert( action( SMESHOp::OpFreeEdge ), aSubId, -1 );
-  popupMgr()->setRule( action( SMESHOp::OpFreeEdge ), aMeshInVtkHasEdges, QtxPopupMgr::VisibleRule );
-  popupMgr()->setRule( action( SMESHOp::OpFreeEdge ), "controlMode = 'eFreeEdges'", QtxPopupMgr::ToggleRule );
-
   popupMgr()->insert( action( SMESHOp::OpFreeBorder ), aSubId, -1 );
-  popupMgr()->setRule( action( SMESHOp::OpFreeBorder ), aMeshInVtkHasEdges, QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( SMESHOp::OpFreeBorder ), aMeshInVTK + "&&" + hasEdges + "&&" + hasFacesOrVolumes, QtxPopupMgr::VisibleRule );
   popupMgr()->setRule( action( SMESHOp::OpFreeBorder ), "controlMode = 'eFreeBorders'", QtxPopupMgr::ToggleRule );
 
   popupMgr()->insert( action( SMESHOp::OpLength ), aSubId, -1 );
@@ -4559,6 +4605,10 @@ void SMESHGUI::initialize( CAM_Application* app )
 
   aSubId = popupMgr()->insert( tr( "MEN_FACE_CTRL" ), anId, -1 ); // FACE CONTROLS
 
+  popupMgr()->insert( action( SMESHOp::OpFreeEdge ), aSubId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpFreeEdge ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( SMESHOp::OpFreeEdge ), "controlMode = 'eFreeEdges'", QtxPopupMgr::ToggleRule );
+
   popupMgr()->insert ( action( SMESHOp::OpFreeFace ), aSubId, -1 );
   popupMgr()->setRule( action( SMESHOp::OpFreeFace ), aMeshInVtkHasFaces /*aMeshInVtkHasVolumes*/,
                                        QtxPopupMgr::VisibleRule );
@@ -4639,6 +4689,9 @@ void SMESHGUI::initialize( CAM_Application* app )
 
   popupMgr()->insert( separator(), anId, -1 );
 
+  popupMgr()->insert( action( SMESHOp::OpShowScalarBar ), anId, -1 );
+  popupMgr()->setRule( action( SMESHOp::OpShowScalarBar ), aMeshInVTK + "&& controlMode <> 'eNone'", QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( SMESHOp::OpShowScalarBar ), aMeshInVTK + "&& controlMode <> 'eNone' && isScalarBarVisible", QtxPopupMgr::ToggleRule );
   popupMgr()->insert( action( SMESHOp::OpScalarBarProperties ), anId, -1 );
   popupMgr()->setRule( action( SMESHOp::OpScalarBarProperties ), aMeshInVTK + "&& controlMode <> 'eNone'", QtxPopupMgr::VisibleRule );
 
@@ -4651,7 +4704,7 @@ void SMESHGUI::initialize( CAM_Application* app )
 
   popupMgr()->insert( action( SMESHOp::OpShowDistribution ), aSubId, -1 );
   popupMgr()->setRule( action( SMESHOp::OpShowDistribution ), aMeshInVTK + "&& isNumFunctor", QtxPopupMgr::VisibleRule );
-  popupMgr()->setRule( action( SMESHOp::OpShowDistribution ), aMeshInVTK + "&& isNumFunctor && isDistributionVisible", QtxPopupMgr::ToggleRule);
+  popupMgr()->setRule( action( SMESHOp::OpShowDistribution ), aMeshInVTK + "&& isNumFunctor && isScalarBarVisible && isDistributionVisible", QtxPopupMgr::ToggleRule);
 
 #ifndef DISABLE_PLOT2DVIEWER
   popupMgr()->insert( action( SMESHOp::OpPlotDistribution ), aSubId, -1 );
@@ -4734,14 +4787,15 @@ bool SMESHGUI::activateModule( SUIT_Study* study )
 
   // import Python module that manages SMESH plugins (need to be here because SalomePyQt API uses active module)
   PyGILState_STATE gstate = PyGILState_Ensure();
-  PyObjWrapper pluginsmanager = PyImport_ImportModuleNoBlock((char*)"salome_pluginsmanager");
+  PyObject* pluginsmanager = PyImport_ImportModuleNoBlock((char*)"salome_pluginsmanager");
   if ( !pluginsmanager ) {
     PyErr_Print();
   }
   else {
-    PyObjWrapper result = PyObject_CallMethod( pluginsmanager, (char*)"initialize", (char*)"isss",1,"smesh",tr("MEN_MESH").toStdString().c_str(),tr("SMESH_PLUGINS_OTHER").toStdString().c_str());
+    PyObject* result = PyObject_CallMethod( pluginsmanager, (char*)"initialize", (char*)"isss",1,"smesh",tr("MEN_MESH").toUtf8().data(),tr("SMESH_PLUGINS_OTHER").toUtf8().data());
     if ( !result )
       PyErr_Print();
+    Py_XDECREF(result);
   }
   PyGILState_Release(gstate);
   // end of SMESH plugins loading
@@ -4751,11 +4805,10 @@ bool SMESHGUI::activateModule( SUIT_Study* study )
 
   //  0020210. Make SMESH_Gen update meshes at switching GEOM->SMESH
   GetSMESHGen()->SetCurrentStudy(SALOMEDS::Study::_nil());
-  if ( SalomeApp_Study* s = dynamic_cast<SalomeApp_Study*>( study ))
-    if ( _PTR(Study) aStudy = s->studyDS()) {
+  if ( SalomeApp_Study* s = dynamic_cast<SalomeApp_Study*>( study )) {
+    if ( _PTR(Study) aStudy = s->studyDS() )
       GetSMESHGen()->SetCurrentStudy( _CAST(Study,aStudy)->GetStudy() );
-      updateObjBrowser(); // objects can be removed
-    }
+  }
 
   // get all view currently opened in the study and connect their signals  to
   // the corresponding slots of the class.
@@ -4767,6 +4820,7 @@ bool SMESHGUI::activateModule( SUIT_Study* study )
       connectView( wnd );
   }
 
+  Py_XDECREF(pluginsmanager);
   return res;
 }
 
@@ -4851,7 +4905,9 @@ void SMESHGUI::windows( QMap<int, int>& aMap ) const
 {
   aMap.insert( SalomeApp_Application::WT_ObjectBrowser, Qt::LeftDockWidgetArea );
   aMap.insert( SalomeApp_Application::WT_NoteBook, Qt::LeftDockWidgetArea );
+#ifndef DISABLE_PYCONSOLE
   aMap.insert( SalomeApp_Application::WT_PyConsole, Qt::BottomDockWidgetArea );
+#endif
 }
 
 void SMESHGUI::viewManagers( QStringList& list ) const
@@ -4869,6 +4925,7 @@ void SMESHGUI::onViewManagerActivated( SUIT_ViewManager* mgr )
       SUIT_ViewWindow *sf = aViews[i];
       connectView( sf );
     }
+    EmitSignalActivatedViewManager();
   }
 }
 
@@ -4891,7 +4948,7 @@ void SMESHGUI::ProcessEvents( vtkObject* theObject,
                               void* theCallData )
 {
   if( SMESHGUI* aSMESHGUI = reinterpret_cast<SMESHGUI*>( theClientData ) ) {
-    if( theObject && theEvent == SMESH::DeleteActorEvent ) {
+    if( theObject && (int) theEvent == SMESH::DeleteActorEvent ) {
       if( SMESH_Actor* anActor = SMESH_Actor::SafeDownCast( theObject ) ) {
         SMESHGUI_ClippingPlaneInfoMap& aClippingPlaneInfoMap = aSMESHGUI->getClippingPlaneInfoMap();
         SMESHGUI_ClippingPlaneInfoMap::iterator anIter1 = aClippingPlaneInfoMap.begin();
@@ -4980,6 +5037,7 @@ void SMESHGUI::createPreferences()
   int exportgroup = addPreference( tr( "PREF_GROUP_EXPORT" ), genTab );
   setPreferenceProperty( exportgroup, "columns", 2 );
   addPreference( tr( "PREF_AUTO_GROUPS" ), exportgroup, LightApp_Preferences::Bool, "SMESH", "auto_groups" );
+  addPreference( tr( "PREF_SHOW_WARN" ), exportgroup, LightApp_Preferences::Bool, "SMESH", "show_warning" );
   //addPreference( tr( "PREF_RENUMBER" ), exportgroup, LightApp_Preferences::Bool, "SMESH", "renumbering" );
 
   int computeGroup = addPreference( tr( "PREF_GROUP_COMPUTE" ), genTab );
@@ -5102,7 +5160,8 @@ void SMESHGUI::createPreferences()
   QStringList     aMarkerScaleValuesList;
   for ( int i = VTK::MS_10; i <= VTK::MS_70; i++ ) {
     aMarkerScaleIndicesList << i;
-    aMarkerScaleValuesList  << QString::number( (i-(int)VTK::MS_10)*0.5 + 1.0 );
+    //aMarkerScaleValuesList  << QString::number( (i-(int)VTK::MS_10)*0.5 + 1.0 );
+    aMarkerScaleValuesList  << QString::number( i );
   }
   setPreferenceProperty( markerScale, "strings", aMarkerScaleValuesList );
   setPreferenceProperty( markerScale, "indexes", aMarkerScaleIndicesList );
@@ -5129,8 +5188,10 @@ void SMESHGUI::createPreferences()
 
   int size0d = addPreference(tr("PREF_SIZE_0D"), elemGroup,
                              LightApp_Preferences::IntSpin, "SMESH", "elem0d_size");
-  int ballSize = addPreference(tr("PREF_BALL_SIZE"), elemGroup,
-                             LightApp_Preferences::IntSpin, "SMESH", "ball_elem_size");
+  /* int ballSize = addPreference(tr("PREF_BALL_SIZE"), elemGroup,
+                             LightApp_Preferences::IntSpin, "SMESH", "ball_elem_size"); */
+  double ballDiameter = addPreference(tr("PREF_BALL_DIAMETER"), elemGroup,
+                             LightApp_Preferences::DblSpin, "SMESH", "ball_elem_diameter");
   double ballScale = addPreference(tr("PREF_BALL_SCALE"), elemGroup,
                              LightApp_Preferences::DblSpin, "SMESH", "ball_elem_scale");
   int elemW  = addPreference(tr("PREF_WIDTH"), elemGroup,
@@ -5143,8 +5204,12 @@ void SMESHGUI::createPreferences()
   setPreferenceProperty( size0d, "min", 1 );
   setPreferenceProperty( size0d, "max", 10 );
 
-  setPreferenceProperty( ballSize, "min", 1 );
-  setPreferenceProperty( ballSize, "max", 10 );
+ // setPreferenceProperty( ballSize, "min", 1 );
+ // setPreferenceProperty( ballSize, "max", 10 );
+
+  setPreferenceProperty( ballDiameter, "min", 1e-7 );
+  setPreferenceProperty( ballDiameter, "max", 1e9 );
+  setPreferenceProperty( ballDiameter, "step", 0.1 );
 
   setPreferenceProperty( ballScale, "min", 1e-2 );
   setPreferenceProperty( ballScale, "max", 1e7 );
@@ -5289,79 +5354,92 @@ void SMESHGUI::createPreferences()
 
 void SMESHGUI::preferencesChanged( const QString& sect, const QString& name )
 {
-  if( sect=="SMESH" ) {
-    float sbX1,sbY1,sbW,sbH;
+  if ( sect=="SMESH" ) {
+    float sbX1 = 0.01, sbY1 = 0.01, sbW = 0.08, sbH = 0.08;
     float aTol = 1.00000009999999;
     std::string aWarning;
     SUIT_ResourceMgr* aResourceMgr = SMESH::GetResourceMgr(this);
-    if( name=="selection_object_color" || name=="selection_element_color" ||
-        name=="highlight_color" ||
-        name=="selection_precision_node" || name=="selection_precision_element" ||
-        name=="selection_precision_object")
+
+    if ( name== "selection_object_color" ||
+         name=="selection_element_color" ||
+         name==        "highlight_color" ||
+         name=="selection_precision_node"    ||
+         name=="selection_precision_element" ||
+         name=="selection_precision_object"   )
+    {
       SMESH::UpdateSelectionProp( this );
-    else if (name == QString("scalar_bar_vertical_x") || name == QString("scalar_bar_vertical_width")){
-      sbX1 = aResourceMgr->doubleValue("SMESH", "scalar_bar_vertical_x", sbX1);
-      sbW = aResourceMgr->doubleValue("SMESH", "scalar_bar_vertical_width", sbW);
-      if(sbX1+sbW > aTol){
+    }
+    else if (name == "scalar_bar_vertical_x" || name == "scalar_bar_vertical_width")
+    {
+      sbX1 = aResourceMgr->doubleValue("SMESH", "scalar_bar_vertical_x",     sbX1);
+      sbW  = aResourceMgr->doubleValue("SMESH", "scalar_bar_vertical_width", sbW);
+      if ( sbX1+sbW > aTol ) {
         aWarning = "Origin and Size Vertical: X+Width > 1\n";
-        sbX1=0.01;
-        sbW=0.08;
-        aResourceMgr->setValue("SMESH", "scalar_bar_vertical_x", sbX1);
+        sbX1 = 0.01;
+        sbW  = 0.08;
+        aResourceMgr->setValue("SMESH", "scalar_bar_vertical_x",     sbX1);
         aResourceMgr->setValue("SMESH", "scalar_bar_vertical_width", sbW);
       }
     }
-    else if(name == QString("scalar_bar_vertical_y") || name == QString("scalar_bar_vertical_height")){
-      sbY1 = aResourceMgr->doubleValue("SMESH", "scalar_bar_vertical_y", sbY1);
-      sbH = aResourceMgr->doubleValue("SMESH", "scalar_bar_vertical_height",sbH);
-      if(sbY1+sbH > aTol){
+    else if (name == "scalar_bar_vertical_y" || name == "scalar_bar_vertical_height" )
+    {
+      sbY1 = aResourceMgr->doubleValue("SMESH", "scalar_bar_vertical_y",     sbY1);
+      sbH  = aResourceMgr->doubleValue("SMESH", "scalar_bar_vertical_height",sbH);
+      if ( sbY1 + sbH > aTol ) {
         aWarning = "Origin and Size Vertical: Y+Height > 1\n";
-        aResourceMgr->setValue("SMESH", "scalar_bar_vertical_y", sbY1);
+        aResourceMgr->setValue("SMESH", "scalar_bar_vertical_y",     sbY1);
         aResourceMgr->setValue("SMESH", "scalar_bar_vertical_height",sbH);
       }
     }
-    else if(name ==  QString("scalar_bar_horizontal_x") || name ==  QString("scalar_bar_horizontal_width")){
-      sbX1 = aResourceMgr->doubleValue("SMESH", "scalar_bar_horizontal_x", sbX1);
-      sbW = aResourceMgr->doubleValue("SMESH", "scalar_bar_horizontal_width", sbW);
-      if(sbX1+sbW > aTol){
+    else if (name == "scalar_bar_horizontal_x" || name ==  "scalar_bar_horizontal_width")
+    {
+      sbX1 = aResourceMgr->doubleValue("SMESH", "scalar_bar_horizontal_x",     sbX1);
+      sbW  = aResourceMgr->doubleValue("SMESH", "scalar_bar_horizontal_width", sbW);
+      if ( sbX1 + sbW > aTol ) {
         aWarning = "Origin and Size Horizontal: X+Width > 1\n";
         sbX1=0.1;
-        sbW=0.08;
+        sbW =0.08;
         aResourceMgr->setValue("SMESH", "scalar_bar_horizontal_x", sbX1);
         aResourceMgr->setValue("SMESH", "scalar_bar_horizontal_width", sbW);
       }
     }
-    else if(name ==  QString("scalar_bar_horizontal_y") || name ==  QString("scalar_bar_horizontal_height")){
-      sbY1 = aResourceMgr->doubleValue("SMESH", "scalar_bar_horizontal_y", sbY1);
-      sbH = aResourceMgr->doubleValue("SMESH", "scalar_bar_horizontal_height",sbH);
-      if(sbY1+sbH > aTol){
+    else if (name == "scalar_bar_horizontal_y" || name ==  "scalar_bar_horizontal_height")
+    {
+      sbY1 = aResourceMgr->doubleValue("SMESH", "scalar_bar_horizontal_y",     sbY1);
+      sbH  = aResourceMgr->doubleValue("SMESH", "scalar_bar_horizontal_height",sbH);
+      if ( sbY1 + sbH > aTol ) {
         aWarning = "Origin and Size Horizontal: Y+Height > 1\n";
         sbY1=0.01;
-        sbH=0.08;
+        sbH =0.08;
         aResourceMgr->setValue("SMESH", "scalar_bar_horizontal_y", sbY1);
         aResourceMgr->setValue("SMESH", "scalar_bar_horizontal_height",sbH);
       }
     }
-    else if ( name == "segmentation" ) {
+    else if ( name == "segmentation" )
+    {
       int nbSeg = aResourceMgr->integerValue( "SMESH", "segmentation", 10 );
       myComponentSMESH->SetBoundaryBoxSegmentation( nbSeg );
     }
-    else if ( name == "nb_segments_per_edge" ) {
+    else if ( name == "nb_segments_per_edge" )
+    {
       int nbSeg = aResourceMgr->integerValue( "SMESH", "nb_segments_per_edge", 15 );
       myComponentSMESH->SetDefaultNbSegments( nbSeg );
     }
-    else if ( name == "historical_python_dump" ||
-              name == "forget_mesh_on_hyp_modif") {
+    else if ( name == "historical_python_dump" || name == "forget_mesh_on_hyp_modif" || name == "default_grp_color" )
+    {
       QString val = aResourceMgr->stringValue( "SMESH", name );
       myComponentSMESH->SetOption( name.toLatin1().constData(), val.toLatin1().constData() );
     }
-    else if ( name == QString( "numbering_node_color" ) || name == QString( "numbering_node_font" ) ) {
-      SMESH::UpdateFontProp( this );    
+    else if ( name == "numbering_node_color" || name == "numbering_node_font" )
+    {
+      SMESH::UpdateFontProp( this );
     }
-    else if ( name == QString( "numbering_elem_color" ) || name == QString( "numbering_elem_font" ) ) {
+    else if ( name == "numbering_elem_color" || name == "numbering_elem_font" )
+    {
       SMESH::UpdateFontProp( this );
     }
 
-    if(aWarning.size() != 0){
+    if ( aWarning.size() != 0 ) {
       aWarning += "The default values are applied instead.";
       SUIT_MessageBox::warning(SMESHGUI::desktop(),
                                QObject::tr("SMESH_ERR_SCALARBAR_PARAMS"),
@@ -5433,6 +5511,9 @@ LightApp_Operation* SMESHGUI::createOperation( const int id ) const
   // to do : create operation here
   switch( id )
   {
+    case SMESHOp::OpSplitBiQuadratic:
+      op = new SMESHGUI_SplitBiQuadOp();
+    break;
     case SMESHOp::OpConvertMeshToQuadratic:
       op = new SMESHGUI_ConvToQuadOp();
     break;
@@ -5449,9 +5530,12 @@ LightApp_Operation* SMESHGUI::createOperation( const int id ) const
       op = new SMESHGUI_MeshOp( true, false );
     break;
     case SMESHOp::OpEditMeshOrSubMesh:
+    case SMESHOp::OpEditMesh:
+    case SMESHOp::OpEditSubMesh:
       op = new SMESHGUI_MeshOp( false );
     break;
     case SMESHOp::OpCompute:
+    case SMESHOp::OpComputeSubMesh:
       op = new SMESHGUI_ComputeOp();
     break;
     case SMESHOp::OpPreCompute:
@@ -5821,7 +5905,8 @@ void SMESHGUI::storeVisualParameters (int savePoint)
                   sizeStr << "elem0d";
                   sizeStr << QString::number((int)aSmeshActor->Get0DSize());
                   sizeStr << "ball";
-                  sizeStr << QString::number((int)aSmeshActor->GetBallSize());
+                  //sizeStr << QString::number((int)aSmeshActor->GetBallSize());
+                  sizeStr << QString::number((double)aSmeshActor->GetBallSize());
                   sizeStr << QString::number((double)aSmeshActor->GetBallScale());
                   sizeStr << "shrink";
                   sizeStr << QString::number(aSmeshActor->GetShrinkFactor());
@@ -6019,6 +6104,12 @@ void SMESHGUI::restoreVisualParameters (int savePoint)
         continue;
 
       TPlaneData aPlaneData;
+      aPlaneData.AbsoluteOrientation = false;
+      aPlaneData.RelativeOrientation = 0;
+      aPlaneData.Distance = aPlaneData.Angle[0] = aPlaneData.Angle[1] = 0;
+      aPlaneData.X = aPlaneData.Y = aPlaneData.Z = 0;
+      aPlaneData.Dx = aPlaneData.Dy = aPlaneData.Dz = 0;
+
       aPlaneData.Id = aClippingPlaneId;
 
       ok = false;
@@ -6172,8 +6263,7 @@ void SMESHGUI::restoreVisualParameters (int savePoint)
               if (ac->IsA("SMESH_Actor")) {
                 SMESH_Actor* aGeomAc = SMESH_Actor::SafeDownCast(ac);
                 if (aGeomAc->hasIO()) {
-                  Handle(SALOME_InteractiveObject) io =
-                    Handle(SALOME_InteractiveObject)::DownCast(aGeomAc->getIO());
+                  Handle(SALOME_InteractiveObject) io = aGeomAc->getIO();
                   if (io->hasEntry() && strcmp(io->getEntry(), entry.toLatin1().data()) == 0) {
                     isFound = true;
                     vtkActors.Bind(viewIndex, aGeomAc);
@@ -6406,7 +6496,8 @@ void SMESHGUI::restoreVisualParameters (int savePoint)
               int lineWidth = -1;
               int outlineWidth = -1;
               int elem0dSize = -1;
-              int ballSize = -1;
+              //int ballSize = -1;
+              double ballDiameter = -1.0;
               double ballScale = -1.0;
               double shrinkSize = -1;
               double orientationSize = -1;
@@ -6439,10 +6530,12 @@ void SMESHGUI::restoreVisualParameters (int savePoint)
                   // - size - is a integer value specifying size
                   // - scale - is a double value specifying scale factor
                   if ( i+1 >= sizes.count() ) break;                       // format error
-                  int v1 = sizes[i+1].toInt( &bOk ); if ( !bOk ) break;    // format error
+                  //int v1 = sizes[i+1].toInt( &bOk ); if ( !bOk ) break;    // format error
+                  double v1 = sizes[i+1].toInt( &bOk ); if ( !bOk ) break;    // format error
                   if ( i+2 >= sizes.count() ) break;                       // format error
                   double v2 = sizes[i+2].toDouble( &bOk ); if ( !bOk ) break; // format error
-                  ballSize = v1;
+                  //ballSize = v1;
+                  ballDiameter = v1;
                   ballScale = v2;
                   i += 2;
                 }
@@ -6478,8 +6571,11 @@ void SMESHGUI::restoreVisualParameters (int savePoint)
               if ( elem0dSize > 0 )
                 aSmeshActor->Set0DSize( elem0dSize );
               // ball size
-              if ( ballSize > 0 )
-                aSmeshActor->SetBallSize( ballSize );
+              /*if ( ballSize > 0 )
+                aSmeshActor->SetBallSize( ballSize );*/
+              // ball diameter
+              if ( ballDiameter > 0 )
+                aSmeshActor->SetBallSize( ballDiameter );
               // ball scale
               if ( ballScale > 0.0 )
                 aSmeshActor->SetBallScale( ballScale );
@@ -6786,6 +6882,48 @@ void SMESHGUI::onHypothesisEdit( int result )
   updateObjBrowser( true );
 }
 
+/*!
+  \brief Actions after choosing menu of control modes
+  Updates control mode actions according to current selection
+*/
+void SMESHGUI::onUpdateControlActions()
+{
+  SALOME_ListIO selected;
+  if ( LightApp_SelectionMgr* aSel = SMESHGUI::selectionMgr() )
+    aSel->selectedObjects( selected );
+
+  SMESH_Actor::eControl aControl = SMESH_Actor::eNone;
+  if ( selected.Extent() ) {
+    if ( selected.First()->hasEntry() ) {
+      if ( SMESH_Actor* anActor = SMESH::FindActorByEntry( selected.First()->getEntry() )) {
+        aControl = anActor->GetControlMode();
+        SALOME_ListIteratorOfListIO it(selected);
+        for ( it.Next(); it.More(); it.Next() ) {
+          Handle(SALOME_InteractiveObject) anIO = it.Value();
+          if ( anIO->hasEntry() ) {
+            if ( SMESH_Actor* anActor = SMESH::FindActorByEntry( anIO->getEntry() ) ) {
+              if ( aControl != anActor->GetControlMode() ) {
+                aControl = SMESH_Actor::eNone;
+                break;
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+
+  int anAction = ActionToControl( aControl, true );
+  if ( anAction)
+    action( anAction )->setChecked( true );
+  else {
+    QMenu* send = (QMenu*)sender();
+    QList<QAction*> actions = send->actions();
+    for ( int i = 0; i < actions.size(); i++ )
+      actions[i]->setChecked( false );
+  }
+}
+
 
 /*!
   \brief Signal handler closing(SUIT_ViewWindow*) of a view
@@ -6796,6 +6934,7 @@ void SMESHGUI::onViewClosed( SUIT_ViewWindow* pview ) {
   //Crear all Plot2d Viewers if need.
   SMESH::ClearPlot2Viewers(pview);
 #endif
+  EmitSignalCloseView();
 }
 
 void SMESHGUI::message( const QString& msg )