Salome HOME
Update the "Colors / Size" dialog.
[modules/smesh.git] / src / SMESHGUI / SMESHGUI.cxx
index 5add18a61e93188c4349a181d64b255d07da3bd9..a3a601a831b81859f51529fb251f0ca797e347cb 100644 (file)
@@ -23,6 +23,9 @@
 //  Author : Nicolas REJNERI, Open CASCADE S.A.S.
 
 #include <Standard_math.hxx>  // E.A. must be included before Python.h to fix compilation on windows
+#ifdef HAVE_FINITE
+#undef HAVE_FINITE            // VSR: avoid compilation warning on Linux : "HAVE_FINITE" redefined
+#endif
 #include "Python.h"
 //  SMESH includes
 #include "SMESHGUI.h"
@@ -49,7 +52,6 @@
 #include "SMESHGUI_Hypotheses.h"
 #include "SMESHGUI_Make2DFrom3DOp.h"
 #include "SMESHGUI_MakeNodeAtPointDlg.h"
-//#include "SMESHGUI_MeshInfosDlg.h"
 #include "SMESHGUI_Measurements.h"
 #include "SMESHGUI_MeshInfo.h"
 #include "SMESHGUI_MeshOp.h"
 #include "SMESHGUI_SewingDlg.h"
 #include "SMESHGUI_SingleEditDlg.h"
 #include "SMESHGUI_SmoothingDlg.h"
-//#include "SMESHGUI_StandardMeshInfosDlg.h"
 #include "SMESHGUI_SymmetryDlg.h"
 #include "SMESHGUI_TranslationDlg.h"
 #include "SMESHGUI_ScaleDlg.h"
 #include "SMESHGUI_TransparencyDlg.h"
-//#include "SMESHGUI_WhatIsDlg.h"
 #include "SMESHGUI_DuplicateNodesDlg.h"
 #include "SMESHGUI_CopyMeshDlg.h"
 
     {
       // warn the user about presence of not supported elements
       SMESH::long_array_var nbElems = aMeshOrGroup->GetMeshInfo();
-      int nbPyramids = nbElems[ SMESH::Entity_Pyramid ] + nbElems[ SMESH::Entity_Quad_Pyramid ];
-      if ( nbPyramids > 0 ) {
+      int nbNotSupported = ( nbElems[ SMESH::Entity_Pyramid ] +
+                             nbElems[ SMESH::Entity_Quad_Pyramid ] +
+                             nbElems[ SMESH::Entity_Hexagonal_Prism ] +
+                             nbElems[ SMESH::Entity_Polygon ] +
+                             nbElems[ SMESH::Entity_Polyhedra ] );
+      if ( nbNotSupported > 0 ) {
         int aRet = SUIT_MessageBox::warning
           (SMESHGUI::desktop(),
            QObject::tr("SMESH_WRN_WARNING"),
       QMap<QString, SMESH::MED_VERSION> aFilterMap;
       //QString v21 (aMesh->GetVersionString(SMESH::MED_V2_1, 2));
       if ( isMED ) {
-       QString v22 (aMesh->GetVersionString(SMESH::MED_V2_2, 2));
-       //aFilterMap.insert( QObject::tr( "MED_VX_FILES_FILTER" ).arg( v21 ) + " (*.med)", SMESH::MED_V2_1 );
-       aFilterMap.insert( QObject::tr( "MED_VX_FILES_FILTER" ).arg( v22 ) + " (*.med)", SMESH::MED_V2_2 );
+        QString v22 (aMesh->GetVersionString(SMESH::MED_V2_2, 2));
+        //aFilterMap.insert( QObject::tr( "MED_VX_FILES_FILTER" ).arg( v21 ) + " (*.med)", SMESH::MED_V2_1 );
+        aFilterMap.insert( QObject::tr( "MED_VX_FILES_FILTER" ).arg( v22 ) + " (*.med)", SMESH::MED_V2_2 );
       }
       else { // isSAUV
-       aFilterMap.insert("All files (*)", SMESH::MED_V2_1 );
-       aFilterMap.insert("SAUV files (*.sauv)", SMESH::MED_V2_2 );
-       aFilterMap.insert("SAUV files (*.sauve)", SMESH::MED_V2_1 );
+        aFilterMap.insert("All files (*)", SMESH::MED_V2_1 );
+        aFilterMap.insert("SAUV files (*.sauv)", SMESH::MED_V2_2 );
+        aFilterMap.insert("SAUV files (*.sauve)", SMESH::MED_V2_1 );
       }
 
       QStringList filters;
           }
         }
         else if ( isSAUV )
-       {
-         for( aMeshIter = aMeshList.begin(); aMeshIter != aMeshList.end(); aMeshIter++ )
-         {
-           SMESH::SMESH_Mesh_var aMeshItem = SMESH::SMESH_Mesh::_narrow( (*aMeshIter).first );
-           if( !aMeshItem->_is_nil() )
-             aMeshItem->ExportSAUV( aFilename.toLatin1().data(), toCreateGroups );
-         }
-       }
+        {
+          for( aMeshIter = aMeshList.begin(); aMeshIter != aMeshList.end(); aMeshIter++ )
+          {
+            SMESH::SMESH_Mesh_var aMeshItem = SMESH::SMESH_Mesh::_narrow( (*aMeshIter).first );
+            if( !aMeshItem->_is_nil() )
+              aMeshItem->ExportSAUV( aFilename.toLatin1().data(), toCreateGroups );
+          }
+        }
         else if ( isDAT )
         {
           if ( aMeshOrGroup->_is_equivalent( aMesh ))
       type = QObject::tr( "OVER_CONSTRAINED_VOLUME" );
     else if ( dynamic_cast< SMESH::Controls::OverConstrainedFace* >( f.get() ) )
       type = QObject::tr( "OVER_CONSTRAINED_FACE" );
+    else if ( dynamic_cast< SMESH::Controls::CoincidentNodes* >( f.get() ) )
+      type = QObject::tr( "EQUAL_NODE" );
+    else if ( dynamic_cast< SMESH::Controls::CoincidentElements1D* >( f.get() ) )
+      type = QObject::tr( "EQUAL_EDGE" );
+    else if ( dynamic_cast< SMESH::Controls::CoincidentElements2D* >( f.get() ) )
+      type = QObject::tr( "EQUAL_FACE" );
+    else if ( dynamic_cast< SMESH::Controls::CoincidentElements3D* >( f.get() ) )
+      type = QObject::tr( "EQUAL_VOLUME" );
     return type;
   }
 
       Handle(SALOME_InteractiveObject) anIO = selected.First();
       if(!anIO.IsNull()){
         SMESH_Actor::eControl aControl = SMESH_Actor::eNone;
-        if(SMESH_Actor *anActor = SMESH::FindActorByEntry(anIO->getEntry())){
+        if(SMESH_Actor *anActor = SMESH::FindActorByEntry(anIO->getEntry())) {
           switch ( theCommandID ){
           case 6001:
             aControl = SMESH_Actor::eLength;
           case 6027:
             aControl = SMESH_Actor::eOverConstrainedFace;
             break;
+          case 6028:
+            aControl = SMESH_Actor::eCoincidentNodes;
+            break;
+          case 6029:
+            aControl = SMESH_Actor::eCoincidentElems1D;
+            break;
+          case 6030:
+            aControl = SMESH_Actor:: eCoincidentElems2D;
+            break;
+          case 6031:
+            aControl = SMESH_Actor::eCoincidentElems3D;
+            break;
           }
+            
           anActor->SetControlMode(aControl);
           anActor->GetScalarBarActor()->SetTitle( functorToString( anActor->GetFunctor() ).toLatin1().constData() );
           SMESH::RepaintCurrentView();
@@ -1688,6 +1713,14 @@ LightApp_Module( "SMESH" )
     myComponentSMESH->SetBoundaryBoxSegmentation( nbSeg );
     nbSeg = aResourceMgr->integerValue( "SMESH", "nb_segments_per_edge", 15 );
     myComponentSMESH->SetDefaultNbSegments( nbSeg );
+
+    const char* options[] = { "historical_python_dump", "forget_mesh_on_hyp_modif" };
+    for ( size_t i = 0; i < sizeof(options)/sizeof(char*); ++i )
+      if ( aResourceMgr->hasValue( "SMESH", options[i] ))
+      {
+        QString val = aResourceMgr->stringValue( "SMESH", options[i] );
+        myComponentSMESH->SetOption( options[i], val.toLatin1().constData() );
+      }
   }
 
   myActiveDialogBox = 0;
@@ -2112,7 +2145,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
 
   case 1134: // Clipping
   case 1133: // Tranparency
-  case 1132: // Colors / Size
+  case 1132: // Display preferences (colors, shrink size, line width, ...)
 
     // Display Mode
   case 215: // Nodes
@@ -2736,38 +2769,6 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       }
       break;
     }
-    /*
-  case 902:                                     // STANDARD MESH INFOS
-    {
-      EmitSignalDeactivateDialog();
-      LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
-      SALOME_ListIO selected;
-      if( aSel )
-        aSel->selectedObjects( selected );
-
-      if ( selected.Extent() > 1 ) { // a dlg for each IO
-        SALOME_ListIO IOs;
-        SALOME_ListIteratorOfListIO It (selected);
-        for ( ; It.More(); It.Next() ) {
-          IOs.Clear();
-          IOs.Append( It.Value() );
-          aSel->setSelectedObjects( IOs );
-          ( new SMESHGUI_StandardMeshInfosDlg( this ) )->show();
-        }
-        // restore selection
-        aSel->setSelectedObjects( selected );
-      }
-      else
-        ( new SMESHGUI_StandardMeshInfosDlg( this ) )->show();
-      break;
-    }
-  case 903:                                     // WHAT IS
-    {
-      EmitSignalDeactivateDialog();
-      ( new SMESHGUI_WhatIsDlg( this ) )->show();
-      break;
-    }
-    */
 
   case 904:                                     // FIND ELEM
     {
@@ -2831,36 +2832,42 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
     }
 
   case 4009:                                    // ELEM0D
-  case 4010:                                    // GEOM::EDGE
+  case 4010:                                    // EDGE
   case 4021:                                    // TRIANGLE
   case 4022:                                    // QUAD
   case 4023:                                    // POLYGON
   case 4031:                                    // TETRA
   case 4032:                                    // HEXA
+  case 4133:                                    // PENTA
+  case 4134:                                    // PYRAMID
+  case 4135:                                    // OCTA12
     {
       if(checkLock(aStudy)) break;
       if ( vtkwnd ) {
         EmitSignalDeactivateDialog();
-        SMDSAbs_ElementType type    = SMDSAbs_Edge;
-        int                 nbNodes = 2;
+        SMDSAbs_EntityType type = SMDSEntity_Edge;
         switch (theCommandID) {
-        case 4009:                                      // ELEM0D
-          type = SMDSAbs_0DElement; nbNodes = 1; break;
-        case 4021:                                      // TRIANGLE
-          type = SMDSAbs_Face; nbNodes = 3; break;
-        case 4022:                                      // QUAD
-          type = SMDSAbs_Face; nbNodes = 4; break;
-        case 4031:                                      // TETRA
-          type = SMDSAbs_Volume; nbNodes = 4; break;
-        case 4023:                                      // POLYGON
-          type = SMDSAbs_Face; nbNodes = 5; break;     // 5 - identificator for POLYGON
-        case 4032:                                      // HEXA
-          type = SMDSAbs_Volume; nbNodes = 8; break;
-        case 4033:                                      // POLYHEDRE
-          type = SMDSAbs_Volume; nbNodes = 9; break; // 9 - identificator for POLYHEDRE
+        case 4009:
+          type = SMDSEntity_0D; break;
+        case 4021:
+          type = SMDSEntity_Triangle; break;
+        case 4022:
+          type = SMDSEntity_Quadrangle; break;
+        case 4031:
+          type = SMDSEntity_Tetra; break;
+        case 4023:
+          type = SMDSEntity_Polygon; break;
+        case 4032:
+          type = SMDSEntity_Hexa; break;
+        case 4133:
+          type = SMDSEntity_Penta; break;
+        case 4134:
+          type = SMDSEntity_Pyramid; break;
+        case 4135:
+          type = SMDSEntity_Hexagonal_Prism; break;
         default:;
         }
-        ( new SMESHGUI_AddMeshElementDlg( this, type, nbNodes ) )->show();
+        ( new SMESHGUI_AddMeshElementDlg( this, type ) )->show();
       }
       else {
         SUIT_MessageBox::warning(desktop(),
@@ -2884,31 +2891,37 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
   case 4034:     // QUADRATIC EDGE
   case 4035:     // QUADRATIC TRIANGLE
   case 4036:     // QUADRATIC QUADRANGLE
+  case 4136:     // BIQUADRATIC QUADRANGLE
   case 4037:     // QUADRATIC TETRAHEDRON
   case 4038:     // QUADRATIC PYRAMID
   case 4039:     // QUADRATIC PENTAHEDRON
   case 4040:     // QUADRATIC HEXAHEDRON
+  case 4140:     // TRIQUADRATIC HEXAHEDRON
     {
       if(checkLock(aStudy)) break;
       if ( vtkwnd ) {
         EmitSignalDeactivateDialog();
-        int type;
+        SMDSAbs_EntityType type;
 
         switch (theCommandID) {
         case 4034:
-          type = QUAD_EDGE; break;
+          type = SMDSEntity_Quad_Edge; break;
         case 4035:
-          type = QUAD_TRIANGLE; break;
+          type = SMDSEntity_Quad_Triangle; break;
         case 4036:
-          type = QUAD_QUADRANGLE; break;
+          type = SMDSEntity_Quad_Quadrangle; break;
+        case 4136:
+          type = SMDSEntity_BiQuad_Quadrangle; break;
         case 4037:
-          type = QUAD_TETRAHEDRON; break;
+          type = SMDSEntity_Quad_Tetra; break;
         case 4038:
-          type = QUAD_PYRAMID; break;
+          type = SMDSEntity_Quad_Pyramid; break;
         case 4039:
-          type = QUAD_PENTAHEDRON; break;
+          type = SMDSEntity_Quad_Penta; break;
         case 4040:
-          type = QUAD_HEXAHEDRON;
+          type = SMDSEntity_Quad_Hexa;
+        case 4140:
+          type = SMDSEntity_TriQuad_Hexa;
           break;
         default:;
         }
@@ -3017,7 +3030,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
             }
             catch (const SALOME::SALOME_Exception& S_ex) {
               SalomeApp_Tools::QtCatchCorbaException(S_ex);
-            } 
+            }
             catch (...) {
             }
           }
@@ -3203,6 +3216,10 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
   case 6025:
   case 6026:
   case 6027:
+  case 6028:
+  case 6029:
+  case 6030:
+  case 6031:
     if ( vtkwnd ) {
 
       LightApp_SelectionMgr* mgr = selectionMgr();
@@ -3327,7 +3344,7 @@ void SMESHGUI::BuildPresentation( const Handle(SALOME_InteractiveObject) & theIO
 // function : createSMESHAction
 // purpose  :
 //=======================================================================
-void SMESHGUI::createSMESHAction( const int id, const QString& po_id, const QString& icon_id, 
+void SMESHGUI::createSMESHAction( const int id, const QString& po_id, const QString& icon_id,
                                   const int key, const bool toggle, const QString& shortcutAction  )
 {
   QIcon icon;
@@ -3345,7 +3362,7 @@ void SMESHGUI::createSMESHAction( const int id, const QString& po_id, const QStr
           menu       = tr( QString( "MEN_%1" ).arg( po_id ).toLatin1().data() ),
           status_bar = tr( QString( "STB_%1" ).arg( po_id ).toLatin1().data() );
 
-  createAction( id, tooltip, icon, menu, status_bar, key, parent, 
+  createAction( id, tooltip, icon, menu, status_bar, key, parent,
                 toggle, this, SLOT( OnGUIEvent() ), shortcutAction );
 }
 
@@ -3450,12 +3467,16 @@ void SMESHGUI::initialize( CAM_Application* app )
   createSMESHAction( 6001, "LENGTH",          "ICON_LENGTH",        0, true );
   createSMESHAction( 6002, "FREE_EDGE",       "ICON_FREE_EDGE",     0, true );
   createSMESHAction( 6021, "FREE_FACES",      "ICON_FREE_FACES",    0, true );
-  createSMESHAction( 6022, "MAX_ELEMENT_LENGTH_2D", "ICON_MAX_ELEMENT_LENGTH_2D", 0, true );
-  createSMESHAction( 6023, "MAX_ELEMENT_LENGTH_3D", "ICON_MAX_ELEMENT_LENGTH_3D", 0, true );
-  createSMESHAction( 6024, "BARE_BORDER_VOLUME","ICON_BARE_BORDER_VOLUME", 0, true );
-  createSMESHAction( 6025, "BARE_BORDER_FACE","ICON_BARE_BORDER_FACE", 0, true );
+  createSMESHAction( 6022, "MAX_ELEMENT_LENGTH_2D",  "ICON_MAX_ELEMENT_LENGTH_2D",   0, true );
+  createSMESHAction( 6023, "MAX_ELEMENT_LENGTH_3D",  "ICON_MAX_ELEMENT_LENGTH_3D",   0, true );
+  createSMESHAction( 6024, "BARE_BORDER_VOLUME",     "ICON_BARE_BORDER_VOLUME",      0, true );
+  createSMESHAction( 6025, "BARE_BORDER_FACE",       "ICON_BARE_BORDER_FACE",        0, true );
   createSMESHAction( 6026, "OVER_CONSTRAINED_VOLUME","ICON_OVER_CONSTRAINED_VOLUME", 0, true );
-  createSMESHAction( 6027, "OVER_CONSTRAINED_FACE","ICON_OVER_CONSTRAINED_FACE", 0, true );
+  createSMESHAction( 6027, "OVER_CONSTRAINED_FACE",  "ICON_OVER_CONSTRAINED_FACE",   0, true );
+  createSMESHAction( 6028, "EQUAL_NODE",      "ICON_EQUAL_NODE",    0, true );
+  createSMESHAction( 6029, "EQUAL_EDGE",      "ICON_EQUAL_EDGE",    0, true );
+  createSMESHAction( 6030, "EQUAL_FACE",      "ICON_EQUAL_FACE",    0, true );
+  createSMESHAction( 6031, "EQUAL_VOLUME",    "ICON_EQUAL_VOLUME",  0, true );
   createSMESHAction( 6003, "FREE_BORDER",     "ICON_FREE_EDGE_2D",  0, true );
   createSMESHAction( 6004, "CONNECTION",      "ICON_CONNECTION",    0, true );
   createSMESHAction( 6005, "FREE_NODE",       "ICON_FREE_NODE",     0, true );
@@ -3477,9 +3498,22 @@ void SMESHGUI::initialize( CAM_Application* app )
   createSMESHAction( 4023, "POLYGON",         "ICON_DLG_POLYGON" );
   createSMESHAction( 4031, "TETRA",           "ICON_DLG_TETRAS" );
   createSMESHAction( 4032, "HEXA",            "ICON_DLG_HEXAS" );
-  createSMESHAction( 4041, "REMOVE_NODES",    "ICON_DLG_REM_NODE" );
-  createSMESHAction( 4042, "REMOVE_ELEMENTS", "ICON_DLG_REM_ELEMENT" );
-  createSMESHAction( 4044, "REMOVE_ORPHAN_NODES", "ICON_DLG_REM_ORPHAN_NODES" );
+  createSMESHAction( 4133, "PENTA",           "ICON_DLG_PENTA" );
+  createSMESHAction( 4134, "PYRAMID",         "ICON_DLG_PYRAMID" );
+  createSMESHAction( 4135, "OCTA",            "ICON_DLG_OCTA" );
+  createSMESHAction( 4033, "POLYHEDRON",              "ICON_DLG_POLYHEDRON" );
+  createSMESHAction( 4034, "QUADRATIC_EDGE",          "ICON_DLG_QUADRATIC_EDGE" );
+  createSMESHAction( 4035, "QUADRATIC_TRIANGLE",      "ICON_DLG_QUADRATIC_TRIANGLE" );
+  createSMESHAction( 4036, "QUADRATIC_QUADRANGLE",    "ICON_DLG_QUADRATIC_QUADRANGLE" );
+  createSMESHAction( 4136, "BIQUADRATIC_QUADRANGLE",  "ICON_DLG_BIQUADRATIC_QUADRANGLE" );
+  createSMESHAction( 4037, "QUADRATIC_TETRAHEDRON",   "ICON_DLG_QUADRATIC_TETRAHEDRON" );
+  createSMESHAction( 4038, "QUADRATIC_PYRAMID",       "ICON_DLG_QUADRATIC_PYRAMID" );
+  createSMESHAction( 4039, "QUADRATIC_PENTAHEDRON",   "ICON_DLG_QUADRATIC_PENTAHEDRON" );
+  createSMESHAction( 4040, "QUADRATIC_HEXAHEDRON",    "ICON_DLG_QUADRATIC_HEXAHEDRON" );
+  createSMESHAction( 4140, "TRIQUADRATIC_HEXAHEDRON", "ICON_DLG_TRIQUADRATIC_HEXAHEDRON" );
+  createSMESHAction( 4041, "REMOVE_NODES",          "ICON_DLG_REM_NODE" );
+  createSMESHAction( 4042, "REMOVE_ELEMENTS",       "ICON_DLG_REM_ELEMENT" );
+  createSMESHAction( 4044, "REMOVE_ORPHAN_NODES",   "ICON_DLG_REM_ORPHAN_NODES" );
   createSMESHAction( 4043, "CLEAR_MESH"    ,  "ICON_CLEAR_MESH" );
   createSMESHAction( 4051, "RENUM_NODES",     "ICON_DLG_RENUMBERING_NODES" );
   createSMESHAction( 4052, "RENUM_ELEMENTS",  "ICON_DLG_RENUMBERING_ELEMENTS" );
@@ -3546,14 +3580,6 @@ void SMESHGUI::initialize( CAM_Application* app )
   createSMESHAction( 300, "ERASE" );
   createSMESHAction( 301, "DISPLAY" );
   createSMESHAction( 302, "DISPLAY_ONLY" );
-  createSMESHAction( 4033, "POLYHEDRON", "ICON_DLG_POLYHEDRON" );
-  createSMESHAction( 4034, "QUADRATIC_EDGE", "ICON_DLG_QUADRATIC_EDGE" );
-  createSMESHAction( 4035, "QUADRATIC_TRIANGLE", "ICON_DLG_QUADRATIC_TRIANGLE" );
-  createSMESHAction( 4036, "QUADRATIC_QUADRANGLE", "ICON_DLG_QUADRATIC_QUADRANGLE" );
-  createSMESHAction( 4037, "QUADRATIC_TETRAHEDRON", "ICON_DLG_QUADRATIC_TETRAHEDRON" );
-  createSMESHAction( 4038, "QUADRATIC_PYRAMID", "ICON_DLG_QUADRATIC_PYRAMID" );
-  createSMESHAction( 4039, "QUADRATIC_PENTAHEDRON", "ICON_DLG_QUADRATIC_PENTAHEDRON" );
-  createSMESHAction( 4040, "QUADRATIC_HEXAHEDRON", "ICON_DLG_QUADRATIC_HEXAHEDRON" );
 
   // ----- create menu --------------
   int fileId    = createMenu( tr( "MEN_FILE" ),    -1,  1 ),
@@ -3630,10 +3656,12 @@ void SMESHGUI::initialize( CAM_Application* app )
   createMenu( separator(), meshId, -1 );
 
   createMenu( 6005, nodeId, -1 );
+  createMenu( 6028, nodeId, -1 );
   createMenu( 6002, edgeId, -1 );
   createMenu( 6003, edgeId, -1 );
   createMenu( 6001, edgeId, -1 );
   createMenu( 6004, edgeId, -1 );
+  createMenu( 6029, edgeId, -1 );
   createMenu( 6021, faceId, -1 );
   createMenu( 6025, faceId, -1 );
   createMenu( 6027, faceId, -1 );
@@ -3646,11 +3674,13 @@ void SMESHGUI::initialize( CAM_Application* app )
   createMenu( 6015, faceId, -1 );
   createMenu( 6016, faceId, -1 );
   createMenu( 6022, faceId, -1 );
+  createMenu( 6030, faceId, -1 );
   createMenu( 6017, volumeId, -1 );
   createMenu( 6009, volumeId, -1 );
   createMenu( 6023, volumeId, -1 );
   createMenu( 6024, volumeId, -1 );
   createMenu( 6026, volumeId, -1 );
+  createMenu( 6031, volumeId, -1 );
 
   createMenu( 4000, addId, -1 );
   createMenu( 4009, addId, -1 );
@@ -3660,15 +3690,20 @@ void SMESHGUI::initialize( CAM_Application* app )
   createMenu( 4023, addId, -1 );
   createMenu( 4031, addId, -1 );
   createMenu( 4032, addId, -1 );
+  createMenu( 4133, addId, -1 );
+  createMenu( 4134, addId, -1 );
+  createMenu( 4135, addId, -1 );
   createMenu( 4033, addId, -1 );
   createMenu( separator(), addId, -1 );
   createMenu( 4034, addId, -1 );
   createMenu( 4035, addId, -1 );
   createMenu( 4036, addId, -1 );
+  createMenu( 4136, addId, -1 );
   createMenu( 4037, addId, -1 );
   createMenu( 4038, addId, -1 );
   createMenu( 4039, addId, -1 );
   createMenu( 4040, addId, -1 );
+  createMenu( 4140, addId, -1 );
 
   createMenu( 4041, removeId, -1 );
   createMenu( 4042, removeId, -1 );
@@ -3740,11 +3775,13 @@ void SMESHGUI::initialize( CAM_Application* app )
   createTool( separator(), meshTb );
 
   createTool( 6005, ctrlTb );
+  createTool( 6028, ctrlTb );
   createTool( separator(), ctrlTb );
   createTool( 6002, ctrlTb );
   createTool( 6003, ctrlTb );
   createTool( 6001, ctrlTb );
   createTool( 6004, ctrlTb );
+  createTool( 6029, ctrlTb );
   createTool( separator(), ctrlTb );
   createTool( 6021, ctrlTb );
   createTool( 6025, ctrlTb );
@@ -3758,12 +3795,14 @@ void SMESHGUI::initialize( CAM_Application* app )
   createTool( 6015, ctrlTb );
   createTool( 6016, ctrlTb );
   createTool( 6022, ctrlTb );
+  createTool( 6030, ctrlTb );
   createTool( separator(), ctrlTb );
   createTool( 6017, ctrlTb );
   createTool( 6009, ctrlTb );
   createTool( 6023, ctrlTb );
   createTool( 6024, ctrlTb );
   createTool( 6026, ctrlTb );
+  createTool( 6031, ctrlTb );
   createTool( separator(), ctrlTb );
 
   createTool( 4000, addRemTb );
@@ -3774,15 +3813,20 @@ void SMESHGUI::initialize( CAM_Application* app )
   createTool( 4023, addRemTb );
   createTool( 4031, addRemTb );
   createTool( 4032, addRemTb );
+  createTool( 4133, addRemTb );
+  createTool( 4134, addRemTb );
+  createTool( 4135, addRemTb );
   createTool( 4033, addRemTb );
   createTool( separator(), addRemTb );
   createTool( 4034, addRemTb );
   createTool( 4035, addRemTb );
   createTool( 4036, addRemTb );
+  createTool( 4136, addRemTb );
   createTool( 4037, addRemTb );
   createTool( 4038, addRemTb );
   createTool( 4039, addRemTb );
   createTool( 4040, addRemTb );
+  createTool( 4140, addRemTb );
   createTool( separator(), addRemTb );
   createTool( 4041, addRemTb );
   createTool( 4042, addRemTb );
@@ -3884,7 +3928,7 @@ void SMESHGUI::initialize( CAM_Application* app )
   popupMgr()->insert( separator(), -1, 0 );
   createPopupItem( 417, OB, mesh + " " + subMesh );        // convert to quadratic
   createPopupItem( 418, OB, mesh + " " + group,            // create 2D mesh from 3D
-                   "&& dim>=2"); 
+                   "&& dim>=2");
   popupMgr()->insert( separator(), -1, 0 );
 
   QString only_one_non_empty = QString( " && %1=1 && numberOfNodes>0" ).arg( dc );
@@ -4046,6 +4090,10 @@ void SMESHGUI::initialize( CAM_Application* app )
   popupMgr()->setRule( action( 6005 ), aMeshInVtkHasNodes, QtxPopupMgr::VisibleRule );
   popupMgr()->setRule( action( 6005 ), "controlMode = 'eFreeNodes'", QtxPopupMgr::ToggleRule );
 
+  popupMgr()->insert ( action( 6028 ), aSubId, -1 ); // EQUAL_NODE
+  popupMgr()->setRule( action( 6028 ), aMeshInVtkHasNodes, QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( 6028 ), "controlMode = 'eCoincidentNodes'", QtxPopupMgr::ToggleRule);
+
   aSubId = popupMgr()->insert( tr( "MEN_EDGE_CTRL" ), anId, -1 ); // EDGE CONTROLS
 
   popupMgr()->insert( action( 6002 ), aSubId, -1 ); // FREE_EDGE
@@ -4063,6 +4111,9 @@ void SMESHGUI::initialize( CAM_Application* app )
   popupMgr()->insert( action( 6004 ), aSubId, -1 ); // CONNECTION
   popupMgr()->setRule( action( 6004 ), aMeshInVtkHasEdges, QtxPopupMgr::VisibleRule );
   popupMgr()->setRule( action( 6004 ), "controlMode = 'eMultiConnection'", QtxPopupMgr::ToggleRule );
+  popupMgr()->insert ( action( 6029 ), aSubId, -1 ); // EQUAL_EDGE
+  popupMgr()->setRule( action( 6029 ), aMeshInVtkHasEdges, QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( 6029 ), "controlMode = 'eCoincidentElems1D'", QtxPopupMgr::ToggleRule);
 
   aSubId = popupMgr()->insert( tr( "MEN_FACE_CTRL" ), anId, -1 ); // FACE CONTROLS
 
@@ -4114,6 +4165,9 @@ void SMESHGUI::initialize( CAM_Application* app )
   popupMgr()->insert ( action( 6027 ), aSubId, -1 ); // OVER_CONSTRAINED_FACE
   popupMgr()->setRule( action( 6027 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
   popupMgr()->setRule( action( 6027 ), "controlMode = 'eOverConstrainedFace'", QtxPopupMgr::ToggleRule );
+  popupMgr()->insert ( action( 6030 ), aSubId, -1 ); // EQUAL_FACE
+  popupMgr()->setRule( action( 6030 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( 6030 ), "controlMode = 'eCoincidentElems2D'", QtxPopupMgr::ToggleRule );
 
   aSubId = popupMgr()->insert( tr( "MEN_VOLUME_CTRL" ), anId, -1 ); // VOLUME CONTROLS
 
@@ -4137,6 +4191,10 @@ void SMESHGUI::initialize( CAM_Application* app )
   popupMgr()->setRule( action( 6026 ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule );
   popupMgr()->setRule( action( 6026 ), "controlMode = 'eOverConstrainedVolume'", QtxPopupMgr::ToggleRule );
 
+  popupMgr()->insert ( action( 6031 ), aSubId, -1 ); // EQUAL_VOLUME
+  popupMgr()->setRule( action( 6031 ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule );
+  popupMgr()->setRule( action( 6031 ), "controlMode = 'eCoincidentElems3D'", QtxPopupMgr::ToggleRule );
+
   popupMgr()->insert( separator(), anId, -1 );
 
   popupMgr()->insert( action( 201 ), anId, -1 ); // SCALAR_BAR_PROP
@@ -4257,7 +4315,7 @@ bool SMESHGUI::activateModule( SUIT_Study* study )
       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.
   SUIT_Desktop* aDesk = study->application()->desktop();
@@ -4365,7 +4423,7 @@ void SMESHGUI::onViewManagerActivated( SUIT_ViewManager* mgr )
 {
   if ( dynamic_cast<SVTK_ViewManager*>( mgr ) ) {
     SMESH::UpdateSelectionProp( this );
-    
+
     QVector<SUIT_ViewWindow*> aViews = mgr->getViews();
     for(int i = 0; i < aViews.count() ; i++){
       SUIT_ViewWindow *sf = aViews[i];
@@ -4436,6 +4494,11 @@ void SMESHGUI::createPreferences()
   int prec = addPreference( tr( "PREF_PRECISION_VALUE" ), qaGroup, LightApp_Preferences::IntSpin, "SMESH", "controls_precision" );
   setPreferenceProperty( prec, "min", 0 );
   setPreferenceProperty( prec, "max", 16 );
+  int doubleNodesTol = addPreference( tr( "PREF_EQUAL_NODES_TOL" ), qaGroup, LightApp_Preferences::DblSpin, "SMESH", "equal_nodes_tolerance" );
+  setPreferenceProperty( doubleNodesTol, "precision", 10 );
+  setPreferenceProperty( doubleNodesTol, "min", 0.0000000001 );
+  setPreferenceProperty( doubleNodesTol, "max", 1000000.0 );
+  setPreferenceProperty( doubleNodesTol, "step", 0.0000001 );
 
   int dispgroup = addPreference( tr( "PREF_DISPLAY_MODE" ), genTab );
   setPreferenceProperty( dispgroup, "columns", 2 );
@@ -4519,6 +4582,11 @@ void SMESHGUI::createPreferences()
   setPreferenceProperty( nbSeg, "min", 1 );
   setPreferenceProperty( nbSeg, "max", 10000000 );
 
+  int loadGroup = addPreference( tr( "SMESH_PREF_MESH_LOADING" ), genTab );
+  addPreference( tr( "PREF_FORGET_MESH_AT_HYP_MODIF" ), loadGroup, LightApp_Preferences::Bool,
+                 "SMESH", "forget_mesh_on_hyp_modif" );
+
+
   // Quantities with individual precision settings
   int precGroup = addPreference( tr( "SMESH_PREF_GROUP_PRECISION" ), genTab );
   setPreferenceProperty( precGroup, "columns", 2 );
@@ -4551,7 +4619,10 @@ void SMESHGUI::createPreferences()
   setPreferenceProperty( chunkSize, "min",  0 );
   setPreferenceProperty( chunkSize, "max",  1000 );
   setPreferenceProperty( chunkSize, "step", 50 );
-  
+
+  int pyDumpGroup = addPreference( tr( "PREF_PYTHON_DUMP" ), genTab );
+  addPreference( tr( "PREF_HISTORICAL_PYTHON_DUMP" ), pyDumpGroup, LightApp_Preferences::Bool, "SMESH", "historical_python_dump" );
+
   // Mesh tab ------------------------------------------------------------------------
   int meshTab = addPreference( tr( "PREF_TAB_MESH" ) );
   int nodeGroup = addPreference( tr( "PREF_GROUP_NODES" ), meshTab );
@@ -4589,10 +4660,10 @@ void SMESHGUI::createPreferences()
 
   int ColorId = addPreference( tr( "PREF_FILL"     ), elemGroup, LightApp_Preferences::BiColor, "SMESH", "fill_color" );
   addPreference( tr( "PREF_COLOR_0D" ), elemGroup, LightApp_Preferences::Color, "SMESH", "elem0d_color" );
-  
+
   addPreference( tr( "PREF_OUTLINE"  ), elemGroup, LightApp_Preferences::Color, "SMESH", "outline_color" );
   addPreference( tr( "PREF_WIREFRAME"  ), elemGroup, LightApp_Preferences::Color, "SMESH", "wireframe_color" );
-  
+
   setPreferenceProperty( ColorId, "text", tr("PREF_BACKFACE") );
 
   int grpGroup = addPreference( tr( "PREF_GROUP_GROUPS" ), meshTab );
@@ -4636,19 +4707,11 @@ void SMESHGUI::createPreferences()
 
   addPreference( tr( "PREF_OBJECT_COLOR" ), selGroup, LightApp_Preferences::Color, "SMESH", "selection_object_color" );
   addPreference( tr( "PREF_ELEMENT_COLOR" ), selGroup, LightApp_Preferences::Color, "SMESH", "selection_element_color" );
-  int selW = addPreference( tr( "PREF_WIDTH" ), selGroup, LightApp_Preferences::IntSpin, "SMESH", "selection_width" );
-
-  setPreferenceProperty( selW, "min", 1 );
-  setPreferenceProperty( selW, "max", 5 );
 
   int preGroup = addPreference( tr( "PREF_GROUP_PRESELECTION" ), selTab );
   setPreferenceProperty( preGroup, "columns", 2 );
 
   addPreference( tr( "PREF_HIGHLIGHT_COLOR" ), preGroup, LightApp_Preferences::Color, "SMESH", "highlight_color" );
-  int preW = addPreference( tr( "PREF_WIDTH" ), preGroup, LightApp_Preferences::IntSpin, "SMESH", "highlight_width" );
-
-  setPreferenceProperty( preW, "min", 1 );
-  setPreferenceProperty( preW, "max", 5 );
 
   int precSelGroup = addPreference( tr( "PREF_GROUP_PRECISION" ), selTab );
   setPreferenceProperty( precSelGroup, "columns", 2 );
@@ -4729,12 +4792,12 @@ void SMESHGUI::createPreferences()
   setPreferenceProperty( hh, "min", 0.0 );
   setPreferenceProperty( hh, "max", 1.0 );
   setPreferenceProperty( hh, "step", 0.1 );
-  
+
   int distributionGr = addPreference( tr( "SMESH_DISTRIBUTION_SCALARBAR" ), sbarTab, LightApp_Preferences::Auto, "SMESH", "distribution_visibility" );
   int coloringType = addPreference( tr( "SMESH_DISTRIBUTION_COLORING_TYPE" ), distributionGr, LightApp_Preferences::Selector, "SMESH", "distribution_coloring_type" );
   setPreferenceProperty( distributionGr, "columns", 3 );
   QStringList types;
-  types.append( tr( "SMESH_MONOCOLOR" ) ); 
+  types.append( tr( "SMESH_MONOCOLOR" ) );
   types.append( tr( "SMESH_MULTICOLOR" ) );
   indices.clear(); indices.append( 0 ); indices.append( 1 );
   setPreferenceProperty( coloringType, "strings", types );
@@ -4751,7 +4814,7 @@ void SMESHGUI::preferencesChanged( const QString& sect, const QString& name )
     std::string aWarning;
     SUIT_ResourceMgr* aResourceMgr = SMESH::GetResourceMgr(this);
     if( name=="selection_object_color" || name=="selection_element_color" ||
-        name=="selection_width" || name=="highlight_color" || name=="highlight_width" ||
+        name=="highlight_color" ||
         name=="selection_precision_node" || name=="selection_precision_element" ||
         name=="selection_precision_object")
       SMESH::UpdateSelectionProp( this );
@@ -4805,6 +4868,11 @@ void SMESHGUI::preferencesChanged( const QString& sect, const QString& name )
       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") {
+      QString val = aResourceMgr->stringValue( "SMESH", name );
+      myComponentSMESH->SetOption( name.toLatin1().constData(), val.toLatin1().constData() );
+    }
 
     if(aWarning.size() != 0){
       aWarning += "The default values are applied instead.";
@@ -5164,7 +5232,7 @@ void SMESHGUI::storeVisualParameters (int savePoint)
                   // Colors (surface:edge:)
                   vtkFloatingPointType r, g, b;
                   int delta;
-                  
+
                   aSmeshActor->GetSufaceColor(r, g, b, delta);
                   QString colorStr ("surface");
                   colorStr += gDigitsSep; colorStr += QString::number(r);
@@ -5173,7 +5241,7 @@ void SMESHGUI::storeVisualParameters (int savePoint)
 
                   colorStr += gDigitsSep; colorStr += "backsurface";
                   colorStr += gDigitsSep; colorStr += QString::number(delta);
-                                      
+
 
                   aSmeshActor->GetEdgeColor(r, g, b);
                   colorStr += gDigitsSep; colorStr += "edge";
@@ -5243,7 +5311,7 @@ void SMESHGUI::storeVisualParameters (int savePoint)
                       for ( ; anIter2 != anActorList.end(); anIter2++ ) {
                         if( aSmeshActor == *anIter2 ) {
                           ip->setParameter( entry, param + QString::number( ++aPlaneId ).toLatin1().constData(),
-                                            QString::number( anId ).toLatin1().constData() );                          
+                                            QString::number( anId ).toLatin1().constData() );
                           break;
                         }
                       }
@@ -5408,7 +5476,7 @@ void SMESHGUI::restoreVisualParameters (int savePoint)
         continue;
 
       TPlaneDataList& aPlaneDataList = aPlaneDataMap[ aViewId ];
-      aPlaneDataList.push_back( aPlaneData );      
+      aPlaneDataList.push_back( aPlaneData );
     }
   }
 
@@ -5552,18 +5620,18 @@ void SMESHGUI::restoreVisualParameters (int savePoint)
                           "surface:r:g:b:backsurface:r:g:b:edge:r:g:b:node:r:g:b or surface:r:g:b:backsurface:delta:edge:r:g:b:node:r:g:b:outline:r:g:b");
                 }
                 else {
-                  int delta = 0; 
+                  int delta = 0;
                   float er,eg,eb;
                   float nr,ng,nb;
                   vtkFloatingPointType otr,otg,otb;
                   //Old case backsurface color is independent
                   if( colors.count() == 16 ) {
                     QColor ffc;
-                    SMESH::GetColor( "SMESH", "fill_color", ffc, delta, "0,170,255|-100" ) ;              
+                    SMESH::GetColor( "SMESH", "fill_color", ffc, delta, "0,170,255|-100" ) ;
                     er = colors[9].toFloat();
                     eg = colors[10].toFloat();
                     eb = colors[11].toFloat();
-                    
+
                     nr = colors[13].toFloat();
                     ng = colors[14].toFloat();
                     nb = colors[15].toFloat();
@@ -5575,7 +5643,7 @@ void SMESHGUI::restoreVisualParameters (int savePoint)
                     er = colors[7].toFloat();
                     eg = colors[8].toFloat();
                     eb = colors[9].toFloat();
-                    
+
                     nr = colors[11].toFloat();
                     ng = colors[12].toFloat();
                     nb = colors[13].toFloat();
@@ -5874,7 +5942,7 @@ void SMESHGUI::onViewClosed( SUIT_ViewWindow* pview ) {
 #ifndef DISABLE_PLOT2DVIEWER
   //Crear all Plot2d Viewers if need.
   SMESH::ClearPlot2Viewers(pview);
-#endif  
+#endif
 }
 
 /*!
@@ -5884,17 +5952,17 @@ void SMESHGUI::onViewClosed( SUIT_ViewWindow* pview ) {
 void SMESHGUI::connectView( const SUIT_ViewWindow* pview ) {
   if(!pview)
     return;
-  
+
   SUIT_ViewManager* viewMgr = pview->getViewManager();
   if ( viewMgr ) {
     disconnect( viewMgr, SIGNAL( deleteView( SUIT_ViewWindow* ) ),
                 this, SLOT( onViewClosed( SUIT_ViewWindow* ) ) );
-    
+
     connect( viewMgr, SIGNAL( deleteView( SUIT_ViewWindow* ) ),
              this, SLOT( onViewClosed( SUIT_ViewWindow* ) ) );
   }
 }
+
 /*!
   \brief Return \c true if object can be renamed
 */
@@ -5910,7 +5978,7 @@ bool SMESHGUI::renameAllowed( const QString& entry) const {
   bool appRes = SalomeApp_Module::renameAllowed(entry);
   if( !appRes )
     return false;
-  
+
   // check type to prevent renaming of inappropriate objects
   int aType = SMESHGUI_Selection::type(qPrintable(entry), aStudy);
   if (aType == MESH || aType == GROUP ||
@@ -5930,11 +5998,11 @@ bool SMESHGUI::renameAllowed( const QString& entry) const {
   \brief Return \c true if rename operation finished successfully, \c false otherwise.
 */
 bool SMESHGUI::renameObject( const QString& entry, const QString& name) {
-  
+
   SalomeApp_Application* anApp = dynamic_cast<SalomeApp_Application*>( application() );
   if( !anApp )
     return false;
-  
+
   _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); //Document OCAF de l'etude active
   if( !aStudy )
     return false;
@@ -5942,7 +6010,7 @@ bool SMESHGUI::renameObject( const QString& entry, const QString& name) {
   bool appRes = SalomeApp_Module::renameObject(entry,name);
   if( !appRes )
     return false;
-  
+
   _PTR(SObject) obj = aStudy->FindObjectID( qPrintable(entry) );
   _PTR(GenericAttribute) anAttr;
   _PTR(AttributeName) aName;
@@ -5958,11 +6026,11 @@ bool SMESHGUI::renameObject( const QString& entry, const QString& name) {
           aType == HYPOTHESIS || aType == ALGORITHM) {
         if ( !name.isEmpty() ) {
           SMESHGUI::GetSMESHGen()->SetName(obj->GetIOR().c_str(), qPrintable(name) );
-          
+
           // update name of group object and its actor
-          Handle(SALOME_InteractiveObject) IObject = 
+          Handle(SALOME_InteractiveObject) IObject =
             new SALOME_InteractiveObject ( qPrintable(entry), "SMESH", qPrintable(name) );
-          
+
           SMESH::SMESH_GroupBase_var aGroupObject = SMESH::IObjectToInterface<SMESH::SMESH_GroupBase>(IObject);
           if( !aGroupObject->_is_nil() ) {
             aGroupObject->SetName( qPrintable(name) );
@@ -5971,7 +6039,7 @@ bool SMESHGUI::renameObject( const QString& entry, const QString& name) {
           }
           return true;
         }
-      }  
+      }
     }
   }
   return false;