Salome HOME
0023636: EDF 18217 - Problem wen suppressing CAD
[modules/smesh.git] / src / SMESHGUI / SMESHGUI.cxx
index c1b913cb5b60566268fa264da92c08aae80d1419..48a96827389ec237ae9acd585a2e972eee55f310 100644 (file)
@@ -550,7 +550,7 @@ namespace
         }
       }
     }
-    
+
     // Warn the user about presence of not supported elements
     QString format;
     std::vector< SMESH::EntityType > notSupportedElemTypes, presentNotSupported;
@@ -655,7 +655,7 @@ namespace
     // Get parameters of export operation
 
     QString aFilename;
-    int aFormat =-1;         // for MED minor versions
+    int aFormat =-1;         // for MED version used for write
     bool isOkToWrite = true; // to check MED file version compatibility before adding a mesh in an existing file
 
     // Init the parameters with the default values
@@ -673,7 +673,7 @@ namespace
 
     QList< QPair< GEOM::ListOfFields_var, QString > > aFieldList;
 
-    // Get a file name to write in and additional otions
+    // Get a file name to write in and additional options
     if ( isUNV || isDAT || isGMF ) // Export w/o options
     {
       if ( isUNV )
@@ -744,38 +744,39 @@ namespace
     }
     else if ( isMED || isSAUV ) // Export to MED or SAUV
     {
+      int defaultVersion = 0;
       QMap<QString, int> aFilterMap;
       if ( isMED ) {
         //filters << QObject::tr( "MED_FILES_FILTER" ) + " (*.med)";
-        QString vmed (aMesh->GetVersionString(-1, 2));
+        //QString vmed (aMesh->GetVersionString(-1, 2));
         //MESSAGE("MED version: " << vmed.toStdString());
-        int minor = vmed.split(".").last().toInt();
-        //MESSAGE("MED version minor: "<< minor);
-        //minor +=3;                  // TODO remove: test multiple minor
-        aFilterMap.insert( QObject::tr( "MED_VX_FILES_FILTER" ).arg( vmed ) + " (*.med)", minor );
-        for (int ii=0; ii<minor; ii++)
+        SMESH::long_array_var mvok = aMesh->GetMEDVersionsCompatibleForAppend();
+        for ( int i = 0; i < mvok->length(); ++i )  // i=0 must correspond to the current version to set the default filter on it
           {
-            QString vs = aMesh->GetVersionString(ii, 2);
-            //std::ostringstream vss; // TODO remove: test multiple minor
-            //vss << "4.";            // TODO remove: test multiple minor
-            //vss << ii;              // TODO remove: test multiple minor
-            //vs = vss.str().c_str(); // TODO remove: test multiple minor
-            //MESSAGE("MED version: " << vs.toStdString());
-            aFilterMap.insert( QObject::tr( "MED_VX_FILES_FILTER" ).arg( vs ) + " (*.med)",  ii);
+            int versionInt = mvok[i];
+            if (i == 0)
+              defaultVersion = versionInt;
+            std::ostringstream vss;
+            vss << versionInt/10;
+            vss << ".";
+            vss << versionInt%10;
+            QString vs = vss.str().c_str();
+            MESSAGE("MED version: " << vs.toStdString());
+            aFilterMap.insert( QObject::tr( "MED_VX_FILES_FILTER" ).arg( vs ) + " (*.med)",  versionInt);
           }
       }
       else { // isSAUV
         aFilterMap.insert("All files (*)", -1 );
-        aFilterMap.insert("SAUV files (*.sauv)", -1 );
+        aFilterMap.insert("SAUV files (*.sauv)", defaultVersion ); // 0 = default filter (defaultVersion)
         aFilterMap.insert("SAUV files (*.sauve)", -1 );
       }
-
+      MESSAGE("default version="<< defaultVersion);
       QStringList filters;
-      QString aDefaultFilter;
       QMap<QString, int>::const_iterator it = aFilterMap.begin();
+      QString aDefaultFilter = it.key();
       for ( ; it != aFilterMap.end(); ++it ) {
         filters.push_back( it.key() );
-        if (it.key() == 0)
+        if (it.value() == defaultVersion) // explicit default for MED = current MED version
           aDefaultFilter = it.key();
       }
       QStringList checkBoxes;
@@ -790,13 +791,14 @@ namespace
         new SalomeApp_CheckFileDlg ( SMESHGUI::desktop(), false, checkBoxes, true, true, wdgList );
       fd->setWindowTitle( aTitle );
       fd->setNameFilters( filters );
+      fd->selectNameFilter( aDefaultFilter );
       fd->SetChecked( toCreateGroups, 0 );
       fd->SetChecked( toFindOutDim,   1 );
       if ( !anInitialPath.isEmpty() )
         fd->setDirectory( anInitialPath );
       fd->selectFile(aMeshName);
-      
-      
+
+
       QListView *lview = fd->findChild<QListView*>("listView");
       if( lview ) {
         lview->setMinimumHeight(200);
@@ -811,7 +813,7 @@ namespace
 
       bool is_ok = false;
       while (!is_ok) {
-        //MESSAGE("******* Loop on file dialog ***********");
+        MESSAGE("******* Loop on file dialog ***********");
         isOkToWrite =true;
         if ( fd->exec() )
           aFilename = fd->selectedFile();
@@ -820,13 +822,15 @@ namespace
           break;
         }
         aFormat = aFilterMap[fd->selectedNameFilter()];
-        //MESSAGE("selected minor: " << aFormat << " file: " << aFilename.toUtf8().constData());
+        MESSAGE("selected version: " << aFormat << " file: " << aFilename.toUtf8().constData());
         toOverwrite = fv->isOverwrite(aFilename);
+        MESSAGE("toOverwrite:" << toOverwrite);
         is_ok = true;
         if ( !aFilename.isEmpty() ) {
           if( !toOverwrite ) {
-            // can't append to an existing using other format
+            // append is only possible if the existing file format is compatible
             bool isVersionOk = SMESHGUI::GetSMESHGen()->CheckWriteCompatibility( aFilename.toUtf8().constData() );
+            MESSAGE("Append check, isVersionOk:" << isVersionOk);
             if ( !isVersionOk ) {
               int aRet = SUIT_MessageBox::warning(SMESHGUI::desktop(),
                                                   QObject::tr("SMESH_WRN_WARNING"),
@@ -866,7 +870,7 @@ namespace
                                                   QObject::tr("SMESH_BUT_YES"),
                                                   QObject::tr("SMESH_BUT_NO"),
                                                   QObject::tr("SMESH_BUT_CANCEL"), 0, 2);
-             //MESSAGE("answer collision name " << aRet);
+             MESSAGE("answer collision name " << aRet);
              if (aRet == 0) {
                 toOverwrite = true;
                 isOkToWrite = true;
@@ -877,7 +881,7 @@ namespace
           }
         }
       }
-      //MESSAGE(" ****** end of file dialog loop")
+      MESSAGE(" ****** end of file dialog loop, toOverwrite:" << toOverwrite << " isOkToWrite:" << isOkToWrite);
       toCreateGroups = fd->IsChecked(0);
       toFindOutDim   = fd->IsChecked(1);
       fieldSelWdg->GetSelectedFields();
@@ -914,7 +918,7 @@ namespace
 //         }
         if ( isMED && isOkToWrite)
         {
-          //MESSAGE("OK to write MED file "<< aFilename.toUtf8().constData());
+          MESSAGE("OK to write MED file "<< aFilename.toUtf8().constData());
           aMeshIter = aMeshList.begin();
           for( int aMeshIndex = 0; aMeshIter != aMeshList.end(); aMeshIter++, aMeshIndex++ )
           {
@@ -985,7 +989,7 @@ namespace
         wc.suspend();
         SUIT_MessageBox::warning(SMESHGUI::desktop(),
                                  QObject::tr("SMESH_WRN_WARNING"),
-                                 QObject::tr("SMESH_EXPORT_FAILED"));
+                                 QObject::tr("SMESH_EXPORT_FAILED") + SalomeApp_Tools::ExceptionToString(S_ex));
         wc.resume();
       }
     }
@@ -1487,7 +1491,7 @@ namespace
             presentEntities = presentEntities | SMESH_Actor::e0DElements;
           if ( !(presentEntities & SMESH_Actor::eBallElem) && anActor->GetObject()->GetNbEntities( SMDSAbs_Ball ) )
             presentEntities = presentEntities | SMESH_Actor::eBallElem;
-          
+
           // as we know that all types of elements are present, we can exit the loop
           if ( presentEntities == SMESH_Actor::eAllEntity )
             break;
@@ -1525,7 +1529,7 @@ namespace
         dlg.setShrinkCoef( int( shrinkCoef * 100. ) );
         // hide unused controls
         dlg.showControls( presentEntities, hasNodes );
-        
+
         if ( dlg.exec() ) {
           nodeColor        = dlg.nodeColor();
           markerType       = dlg.nodeMarkerType();
@@ -1559,7 +1563,7 @@ namespace
             if ( !IObject->hasEntry() ) continue;
             SMESH_Actor* anActor = SMESH::FindActorByEntry( IObject->getEntry() );
             if ( !anActor ) continue;
-            
+
             // nodes: color, marker
             anActor->SetNodeColor( nodeColor.redF(), nodeColor.greenF(), nodeColor.blueF() );
             if ( markerType != VTK::MT_USER ) {
@@ -1604,17 +1608,17 @@ namespace
                 aColor = nodeColor; break;
               case SMESH::EDGE:
                 aColor = edgeColor; break;
-              case SMESH::FACE: 
+              case SMESH::FACE:
                 aColor = faceColor; break;
               case SMESH::VOLUME:
                 aColor = volumeColor; break;
-              case SMESH::ELEM0D: 
+              case SMESH::ELEM0D:
                 aColor = elem0dColor; break;
-              case SMESH::BALL: 
+              case SMESH::BALL:
                 aColor = ballColor; break;
               default: break;
               }
-              
+
               if ( aColor.isValid() ) {
                 SALOMEDS::Color aGroupColor;
                 aGroupColor.R = aColor.redF();
@@ -1839,7 +1843,7 @@ namespace
     v = qMax( uint(0), qMin ( v, size-1 ) );
     return v;
   }
-  
+
 } //namespace
 
 void SMESHGUI::OnEditDelete()
@@ -1853,6 +1857,7 @@ void SMESHGUI::OnEditDelete()
   _PTR(GenericAttribute) anAttr;
   _PTR(AttributeIOR) anIOR;
 
+  const int objectCountLimit = 30; // PAL23599
   int objectCount = 0;
   QString aNameList;
   QString aParentComponent = QString::null;
@@ -1862,29 +1867,33 @@ void SMESHGUI::OnEditDelete()
     Handle(SALOME_InteractiveObject) anIO = anIt.Value();
     if ( anIO.IsNull() ) continue;
     
-    QString father = "unknown";
+    QString father = "unknown", name;
 
     _PTR(SObject) aSO = aStudy->FindObjectID( anIO->getEntry() );
     if (aSO) {
       father = QString::fromStdString( aSO->GetFatherComponent()->ComponentDataType() );
       // check if object is reference
       _PTR(SObject) aRefSObj;
-      aNameList.append("\n    - ");
       if ( aSO->ReferencedObject( aRefSObj ) ) {
-        QString aRefName = QString::fromStdString ( aRefSObj->GetName() );
-        aNameList.append( aRefName );
+        name = QString::fromStdString ( aRefSObj->GetName() );
         father = QString::fromStdString ( aRefSObj->GetFatherComponent()->ComponentDataType() );
       }
       else
-        aNameList.append(anIO->getName());
+        name = anIO->getName();
       objectCount++;
     }
+    if ( objectCount < objectCountLimit ) { // avoid occupying the whole screen
+      aNameList.append("\n    - ");
+      aNameList.append( name );
+    }
 
     if( aParentComponent.isNull() )
       aParentComponent = father;
     else if( !aParentComponent.isEmpty() && aParentComponent!=father )
       aParentComponent = "";
   }
+  if ( objectCount >= objectCountLimit )
+    aNameList.append("\n    - ...");
 
   if ( objectCount == 0 )
     return; // No Valid Objects Selected
@@ -2133,20 +2142,20 @@ bool SMESHGUI::automaticUpdate( SMESH::SMESH_IDSource_ptr theMesh,
   SMESH::long_array_var info = theMesh->GetMeshInfo();
   long nbOdElems = info[SMDSEntity_0D];
   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] + 
+  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_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] + 
+  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] +
                    info[SMDSEntity_Penta]   + info[SMDSEntity_Quad_Penta] + info[SMDSEntity_BiQuad_Penta] +
-                   info[SMDSEntity_Polyhedra] + 
+                   info[SMDSEntity_Polyhedra] +
                    info[SMDSEntity_Hexagonal_Prism];
   long nbBalls   = info[SMDSEntity_Ball];
 
   long requestedSize = nbOdElems + nbBalls + nbEdges + nbFaces + nbVolumes;
   *nbElements = requestedSize;
-  
+
   *entities = SMESH_Actor::eAllEntity;
   *hidden   = 0;
 
@@ -3152,7 +3161,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
         SALOME_ListIteratorOfListIO It( selected );
         for ( ; It.More(); It.Next() ) {
           SMESHGUI_MeshInfoDlg* dlg = new SMESHGUI_MeshInfoDlg( SMESHGUI::desktop(), page );
-          dlg->showInfo( It.Value() ); 
+          dlg->showInfo( It.Value() );
           dlg->show();
         }
       }
@@ -4264,8 +4273,8 @@ void SMESHGUI::initialize( CAM_Application* app )
       addElemTb    = createTool( tr( "TB_ADD" ),       QString( "SMESHAddElementToolbar" ) ),
       addNonElemTb = createTool( tr( "TB_ADDNON" ),    QString( "SMESHAddElementToolbar" ) ),
       remTb        = createTool( tr( "TB_REM" ),       QString( "SMESHRemoveToolbar" ) ),
-    //renumbTb     = createTool( tr( "TB_RENUMBER" ),  QString( "SMESHRenumberingToolbar" ) ),  
-      transformTb  = createTool( tr( "TB_TRANSFORM" ), QString( "SMESHTransformationToolbar" ) ),  
+    //renumbTb     = createTool( tr( "TB_RENUMBER" ),  QString( "SMESHRenumberingToolbar" ) ),
+      transformTb  = createTool( tr( "TB_TRANSFORM" ), QString( "SMESHTransformationToolbar" ) ),
       modifyTb     = createTool( tr( "TB_MODIFY" ),    QString( "SMESHModificationToolbar" ) ),
       measuremTb   = createTool( tr( "TB_MEASUREM" ),  QString( "SMESHMeasurementsToolbar" ) ),
       dispModeTb   = createTool( tr( "TB_DISP_MODE" ), QString( "SMESHDisplayModeToolbar" ) );
@@ -5098,6 +5107,11 @@ void SMESHGUI::createPreferences()
   setPreferenceProperty( doubleNodesTol, "max", 1000000.0 );
   setPreferenceProperty( doubleNodesTol, "step", 0.0000001 );
 
+  /*
+  int cinc = addPreference(tr("PREF_CONTROLS_INCREMENT"), qaGroup, LightApp_Preferences::IntSpin, "SMESH", "controls_increment");
+  setPreferenceProperty( cinc, "min", 0 );
+  setPreferenceProperty( cinc, "max", 5 );
+  */
 
   int exportgroup = addPreference( tr( "PREF_GROUP_EXPORT" ), genTab );
   setPreferenceProperty( exportgroup, "columns", 2 );
@@ -5291,7 +5305,7 @@ void SMESHGUI::createPreferences()
 
   int numGroup = addPreference( tr( "PREF_GROUP_NUMBERING" ), meshTab );
   setPreferenceProperty( numGroup, "columns", 2 );
-  
+
   addPreference( tr( "PREF_NUMBERING_NODE" ), numGroup, LightApp_Preferences::Color, "SMESH", "numbering_node_color" );
   addVtkFontPref( tr( "PREF_NUMBERING_FONT" ), numGroup, "numbering_node_font", true );
 
@@ -5331,6 +5345,10 @@ void SMESHGUI::createPreferences()
   addPreference( tr( "PREF_ELEMENTS" ), precSelGroup, LightApp_Preferences::Double, "SMESH", "selection_precision_element" );
   addPreference( tr( "PREF_OBJECTS" ), precSelGroup, LightApp_Preferences::Double, "SMESH", "selection_precision_object" );
 
+  int sinc = addPreference(tr("PREF_SELECTION_INCREMENT"), selTab, LightApp_Preferences::IntSpin, "SMESH", "selection_increment");
+  setPreferenceProperty( sinc, "min", 0 );
+  setPreferenceProperty( sinc, "max", 5 );
+
   // Scalar Bar tab ------------------------------------------------------------------------
   int sbarTab = addPreference( tr( "SMESH_SCALARBAR" ) );
   int fontGr = addPreference( tr( "SMESH_FONT_SCALARBAR" ), sbarTab );
@@ -5430,7 +5448,8 @@ void SMESHGUI::preferencesChanged( const QString& sect, const QString& name )
          name==        "highlight_color" ||
          name=="selection_precision_node"    ||
          name=="selection_precision_element" ||
-         name=="selection_precision_object"   )
+         name=="selection_precision_object"   ||
+         name=="selection_increment")
     {
       SMESH::UpdateSelectionProp( this );
     }
@@ -5712,7 +5731,7 @@ const char* gPathSep   = "|"; // character used to separate paths
  * \brief Store visual parameters
  *
  * This method is called just before the study document is saved.
- * Store visual parameters in AttributeParameter attribue(s)
+ * Store visual parameters in AttributeParameter attribute(s)
  */
 void SMESHGUI::storeVisualParameters (int savePoint)
 {
@@ -6064,7 +6083,7 @@ typedef std::map<int, TPlaneInfoList> TPlaneInfoMap;
  * \brief Restore visual parameters
  *
  * This method is called after the study document is opened.
- * Restore visual parameters from AttributeParameter attribue(s)
+ * Restore visual parameters from AttributeParameter attribute(s)
  */
 void SMESHGUI::restoreVisualParameters (int savePoint)
 {
@@ -6178,7 +6197,7 @@ void SMESHGUI::restoreVisualParameters (int savePoint)
       aPlaneData.Mode = aPropertyValueList[0].toInt( &ok );
       if( !ok )
         continue;
-      
+
       ok = false;
       aPlaneData.isOpenGLClipping = aPropertyValueList[1].toInt( &ok );
       if( !ok )
@@ -6678,9 +6697,9 @@ void SMESHGUI::restoreVisualParameters (int savePoint)
             // Clipping
             else if (paramNameStr.startsWith("ClippingPlane")) {
               QStringList vals = val.split(gDigitsSep, QString::SkipEmptyParts);
-              // old format - val looks like "Off" or "1:0:0:0.5:0:0" 
+              // old format - val looks like "Off" or "1:0:0:0.5:0:0"
               // (mode(relative), is OpenGL clipping plane, orientation, distance, two angles)
-              // or "0:1:1:10.5:1.0:1.0:15.0:10.0:10.0" 
+              // or "0:1:1:10.5:1.0:1.0:15.0:10.0:10.0"
               // (mode(absolute), is OpenGL clipping plane, orientation, base point(x, y, z), direction (dx, dy, dz))
               // new format - val looks like "Off" or "0" (plane id)
               // (note: in new format "Off" value is used only for consistency,
@@ -6880,10 +6899,10 @@ void SMESHGUI::restoreVisualParameters (int savePoint)
           break;
         }
       }
-    
+
     }
   }
-  
+
 
   // update all VTK views
   QList<SUIT_ViewManager*> lst;
@@ -6899,7 +6918,7 @@ void SMESHGUI::restoreVisualParameters (int savePoint)
       while( vtkActor* aVTKActor = anAllActors->GetNextActor() )
         if( SMESH_Actor* anActor = SMESH_Actor::SafeDownCast( aVTKActor ) )
           anActor->SetOpenGLClippingPlane();
-      
+
       vtkView->getRenderer()->ResetCameraClippingRange();
       vtkView->Repaint();
     }
@@ -7018,7 +7037,7 @@ void SMESHGUI::message( const QString& msg )
         name = SMESH::fromUtf8(obj->GetName());
       if ( name.isEmpty() )
         return;
-      
+
       if ( data.last() == "stop" )
         application()->putInfo( tr( "MESH_LOADING_MSG_FINISHED" ).arg( name ) );
       else
@@ -7059,7 +7078,7 @@ bool SMESHGUI::renameAllowed( const QString& entry) const {
     return false;
 
   SalomeApp_DataObject* obj = dynamic_cast<SalomeApp_DataObject*>(appStudy->findObjectByEntry(entry));
-  
+
   if(!obj)
     return false;
 
@@ -7089,17 +7108,17 @@ bool SMESHGUI::renameObject( const QString& entry, const QString& name) {
   SalomeApp_Application* anApp = dynamic_cast<SalomeApp_Application*>( application() );
   if( !anApp )
     return false;
-    
+
   SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( anApp->activeStudy() );
 
   if(!appStudy)
     return false;
-  
+
   _PTR(Study) aStudy = appStudy->studyDS();
-  
+
   if(!aStudy)
     return false;
-  
+
   bool aLocked = (_PTR(AttributeStudyProperties)(appStudy->studyDS()->GetProperties()))->IsLocked();
   if ( aLocked ) {
     SUIT_MessageBox::warning ( anApp->desktop(), QObject::tr("WRN_WARNING"), QObject::tr("WRN_STUDY_LOCKED") );
@@ -7129,7 +7148,7 @@ bool SMESHGUI::renameObject( const QString& entry, const QString& name) {
 
           SMESH::SMESH_GroupBase_var aGroupObject = SMESH::IObjectToInterface<SMESH::SMESH_GroupBase>(IObject);
           if( !aGroupObject->_is_nil() ) {
-            aGroupObject->SetName( qPrintable(name) );
+            aGroupObject->SetName( qUtf8Printable(name) );
             if ( SMESH_Actor *anActor = SMESH::FindActorByEntry( qPrintable(entry) ) )
               anActor->setName( qUtf8Printable(name) );
           }