Salome HOME
PAL13330( When mesh generation does not success, trace where )
[modules/smesh.git] / src / SMESHGUI / SMESHGUI.cxx
index 9427c8d61c5667dcc0755b9be798a046447fe5b9..67032b6d6200dbbdad99e36553260e000e9b886b 100644 (file)
@@ -57,7 +57,6 @@
 #include "SMESHGUI_RotationDlg.h"
 #include "SMESHGUI_SymmetryDlg.h"
 #include "SMESHGUI_SewingDlg.h"
-#include "SMESHGUI_MergeNodesDlg.h"
 #include "SMESHGUI_EditMeshDlg.h"
 #include "SMESHGUI_MeshPatternDlg.h"
 #include "SMESHGUI_Selection.h"
@@ -67,6 +66,7 @@
 #include "SMESHGUI_Displayer.h"
 #include "SMESHGUI_MakeNodeAtPointDlg.h"
 #include "SMESHGUI_BuildCompoundDlg.h"
+#include "SMESHGUI_ComputeDlg.h"
 
 #include "SMESHGUI_Utils.h"
 #include "SMESHGUI_GEOMGenUtils.h"
@@ -260,6 +260,7 @@ using namespace std;
       if ( !aMesh->_is_nil() ) {
        QString aFilter, aTitle = QObject::tr("Export mesh");
        QMap<QString, SMESH::MED_VERSION> aFilterMap;
+       QMap<QString, int> aFilterMapSTL;
        switch ( theCommandID ) {
        case 125:
        case 122:
@@ -299,6 +300,36 @@ using namespace std;
             aFilter = QObject::tr("IDEAS files (*.unv)");
           }
          break;
+       case 140:
+       case 141:
+          {
+           // export STL
+           /*
+             there must be check on others mesh elements not equal triangles
+           */
+           if (aMesh->NbTriangles() < 1) {
+              int aRet = SUIT_MessageBox::warn1
+                (SMESHGUI::desktop(),
+                 QObject::tr("SMESH_WRN_WARNING"),
+                 QObject::tr("SMESH_EXPORT_STL1").arg(anIObject->getName()),
+                 QObject::tr("SMESH_BUT_OK"));
+             return;
+            }
+           if (!(aMesh->NbElements() - aMesh->NbTriangles())) {
+              int aRet = SUIT_MessageBox::warn2
+                (SMESHGUI::desktop(),
+                 QObject::tr("SMESH_WRN_WARNING"),
+                 QObject::tr("SMESH_EXPORT_STL2").arg(anIObject->getName()),
+                 QObject::tr("SMESH_BUT_YES"),  QObject::tr("SMESH_BUT_NO"),
+                 0, 1, 0);
+              if (aRet)
+                return;
+            }
+
+            aFilterMapSTL.insert( QObject::tr("STL ASCII  (*.stl)"), 1 ); // 1 - ASCII mode
+            aFilterMapSTL.insert( QObject::tr("STL Binary (*.stl)"), 0 ); // 0 - Binary mode
+          }
+         break;
        default:
          return;
        }
@@ -306,13 +337,35 @@ using namespace std;
        QString aFilename;
        SMESH::MED_VERSION aFormat;
        // Init the parameter with the default value
+       bool aIsASCII_STL = true;
        bool toCreateGroups = false;
        SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
        if ( resMgr )
          toCreateGroups = resMgr->booleanValue( "SMESH", "auto_groups", false );
 
-       if ( theCommandID != 122 && theCommandID != 125 )
+       if ( theCommandID != 122 && theCommandID != 125 && theCommandID != 140 && theCommandID != 141)
+
          aFilename = SUIT_FileDlg::getFileName(SMESHGUI::desktop(), "", aFilter, aTitle, false);
+
+       else if(theCommandID == 140 || theCommandID == 141) { // Export to STL
+         QStringList filters;
+          QMap<QString, int>::const_iterator it = aFilterMapSTL.begin();
+          for ( ; it != aFilterMapSTL.end(); ++it )
+            filters.push_back( it.key() );
+
+          SUIT_FileDlg* fd = new SUIT_FileDlg( SMESHGUI::desktop(), false, true, true );
+          fd->setCaption( aTitle );
+          fd->setFilters( filters );
+          fd->setSelectedFilter( QObject::tr("STL ASCII  (*.stl)") );
+          bool is_ok = false;
+          while (!is_ok) {
+            fd->exec();
+            aFilename = fd->selectedFile();
+            aIsASCII_STL = (aFilterMapSTL[fd->selectedFilter()]) == 1 ? true: false;
+            is_ok = true;
+         }
+          delete fd;
+       }
        else {
           QStringList filters;
           QMap<QString, SMESH::MED_VERSION>::const_iterator it = aFilterMap.begin();
@@ -381,6 +434,10 @@ using namespace std;
            case 123:
              aMesh->ExportUNV( aFilename.latin1() );
              break;
+           case 140:
+           case 141:
+             aMesh->ExportSTL( aFilename.latin1(), aIsASCII_STL );
+             break;
            default:
              break;
            }
@@ -811,7 +868,7 @@ using namespace std;
 
             _PTR(SObject) aMeshSO = SMESH::FindSObject(aMesh);
             if (aMeshSO)
-              SMESH::ModifiedMesh(aMeshSO, false);
+              SMESH::ModifiedMesh(aMeshSO, false, aMesh->NbNodes()==0);
           }
           else {
             IObject = new SALOME_InteractiveObject
@@ -1150,6 +1207,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
   case 124:
   case 125:
   case 126:
+  case 140:
+  case 141:
     {
       ::ExportMeshToFile(theCommandID);
       break;
@@ -1304,82 +1363,83 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
     {
       if (checkLock(aStudy)) break;
 
-      LightApp_SelectionMgr *Sel = selectionMgr();
-      SALOME_ListIO selected; Sel->selectedObjects( selected );
-
-      int nbSel = selected.Extent();
-      if (nbSel != 1) {
-        SUIT_MessageBox::warn1(desktop(),
-                               tr("SMESH_WRN_WARNING"),
-                               tr("SMESH_WRN_NO_AVAILABLE_DATA"),
-                               tr("SMESH_BUT_OK"));
-        break;
-      }
-
-      SMESH::SMESH_Mesh_var aMesh;
-      SMESH::SMESH_subMesh_var aSubMesh;
-      Handle(SALOME_InteractiveObject) IObject = selected.First();
-      if (IObject->hasEntry()) {
-        _PTR(SObject) aMeshSObj = aStudy->FindObjectID(IObject->getEntry());
-        GEOM::GEOM_Object_var aShapeObject = SMESH::GetShapeOnMeshOrSubMesh( aMeshSObj );
-        if ( aShapeObject->_is_nil() ) {
-          // imported mesh
-          break;
-        }
-        if ( aMeshSObj ) {
-          aMesh = SMESH::SObjectToInterface<SMESH::SMESH_Mesh>(aMeshSObj);
-          aSubMesh = SMESH::SObjectToInterface<SMESH::SMESH_subMesh>(aMeshSObj);
-          if ( !aSubMesh->_is_nil() )
-            aMesh = aSubMesh->GetFather();
-
-          if (!aMesh->_is_nil()) {
-            SMESH::algo_error_array_var errors = GetSMESHGen()->GetAlgoState(aMesh,aShapeObject);
-            if ( errors->length() > 0 ) {
-              SUIT_MessageBox::warn1(desktop(),
-                                     tr("SMESH_WRN_WARNING"),
-                                     SMESH::GetMessageOnAlgoStateErrors( errors.in() ),
-                                     tr("SMESH_BUT_OK"));
-              break;
-            }
-
-            try {
-              if (GetSMESHGen()->Compute(aMesh, aShapeObject))
-                SMESH::ModifiedMesh(aMeshSObj, true);
-              else
-                SUIT_MessageBox::warn1(desktop(),
-                                       tr("SMESH_WRN_WARNING"),
-                                       tr("SMESH_WRN_COMPUTE_FAILED"),
-                                       tr("SMESH_BUT_OK"));
-            }
-            catch(const SALOME::SALOME_Exception & S_ex){
-              SalomeApp_Tools::QtCatchCorbaException(S_ex);
-            }
-
-            updateObjBrowser();
-
-            if (automaticUpdate()) {
-              SVTK_ViewWindow* aVTKView = SMESH::GetViewWindow(this, /*create*/true);
-              if (aVTKView) {
-                CORBA::Long anId = aStudy->StudyId();
-                TVisualObjPtr aVisualObj = SMESH::GetVisualObj(anId, IObject->getEntry());
-                if (aVisualObj) {
-                  aVisualObj->Update();
-                  SMESH_Actor* anActor = SMESH::FindActorByEntry(IObject->getEntry());
-                  if (!anActor) {
-                    anActor = SMESH::CreateActor(aStudy, IObject->getEntry());
-                    if (anActor) {
-                      SMESH::DisplayActor(aVTKView, anActor); //apo
-                      SMESH::FitAll();
-                    }
-                  }
-                  SMESH::RepaintCurrentView();
-                  Sel->setSelectedObjects( selected );
-                }
-              }
-            }
-          }
-        }
-      }
+      startOperation( 701 );
+//       LightApp_SelectionMgr *Sel = selectionMgr();
+//       SALOME_ListIO selected; Sel->selectedObjects( selected );
+
+//       int nbSel = selected.Extent();
+//       if (nbSel != 1) {
+//         SUIT_MessageBox::warn1(desktop(),
+//                                tr("SMESH_WRN_WARNING"),
+//                                tr("SMESH_WRN_NO_AVAILABLE_DATA"),
+//                                tr("SMESH_BUT_OK"));
+//         break;
+//       }
+
+//       SMESH::SMESH_Mesh_var aMesh;
+//       SMESH::SMESH_subMesh_var aSubMesh;
+//       Handle(SALOME_InteractiveObject) IObject = selected.First();
+//       if (IObject->hasEntry()) {
+//         _PTR(SObject) aMeshSObj = aStudy->FindObjectID(IObject->getEntry());
+//         GEOM::GEOM_Object_var aShapeObject = SMESH::GetShapeOnMeshOrSubMesh( aMeshSObj );
+//         if ( aShapeObject->_is_nil() ) {
+//           // imported mesh
+//           break;
+//         }
+//         if ( aMeshSObj ) {
+//           aMesh = SMESH::SObjectToInterface<SMESH::SMESH_Mesh>(aMeshSObj);
+//           aSubMesh = SMESH::SObjectToInterface<SMESH::SMESH_subMesh>(aMeshSObj);
+//           if ( !aSubMesh->_is_nil() )
+//             aMesh = aSubMesh->GetFather();
+
+//           if (!aMesh->_is_nil()) {
+//             SMESH::algo_error_array_var errors = GetSMESHGen()->GetAlgoState(aMesh,aShapeObject);
+//             if ( errors->length() > 0 ) {
+//               SUIT_MessageBox::warn1(desktop(),
+//                                      tr("SMESH_WRN_WARNING"),
+//                                      SMESH::GetMessageOnAlgoStateErrors( errors.in() ),
+//                                      tr("SMESH_BUT_OK"));
+//               break;
+//             }
+
+//             try {
+//               if (GetSMESHGen()->Compute(aMesh, aShapeObject))
+//                 SMESH::ModifiedMesh(aMeshSObj, true);
+//               else
+//                 SUIT_MessageBox::warn1(desktop(),
+//                                        tr("SMESH_WRN_WARNING"),
+//                                        tr("SMESH_WRN_COMPUTE_FAILED"),
+//                                        tr("SMESH_BUT_OK"));
+//             }
+//             catch(const SALOME::SALOME_Exception & S_ex){
+//               SalomeApp_Tools::QtCatchCorbaException(S_ex);
+//             }
+
+//             updateObjBrowser();
+
+//             if (automaticUpdate()) {
+//               SVTK_ViewWindow* aVTKView = SMESH::GetViewWindow(this, /*create*/true);
+//               if (aVTKView) {
+//                 CORBA::Long anId = aStudy->StudyId();
+//                 TVisualObjPtr aVisualObj = SMESH::GetVisualObj(anId, IObject->getEntry());
+//                 if (aVisualObj) {
+//                   aVisualObj->Update();
+//                   SMESH_Actor* anActor = SMESH::FindActorByEntry(IObject->getEntry());
+//                   if (!anActor) {
+//                     anActor = SMESH::CreateActor(aStudy, IObject->getEntry());
+//                     if (anActor) {
+//                       SMESH::DisplayActor(aVTKView, anActor); //apo
+//                       SMESH::FitAll();
+//                     }
+//                   }
+//                   SMESH::RepaintCurrentView();
+//                   Sel->setSelectedObjects( selected );
+//                 }
+//               }
+//             }
+//           }
+//         }
+//       }
     }
     break;
 
@@ -2092,7 +2152,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       if(checkLock(aStudy)) break;
       if(vtkwnd) {
        EmitSignalDeactivateDialog();
-       new SMESHGUI_MergeNodesDlg( this );
+       new SMESHGUI_EditMeshDlg( this, 0 );
       }
       else {
        SUIT_MessageBox::warn1(desktop(),
@@ -2101,15 +2161,12 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       }
       break;
     }
-  case 4066: // MERGE EQUAL ELEMENTS
+  case 4066:                                   // MERGE EQUAL ELEMENTS
     {
       if (checkLock(aStudy)) break;
       if (vtkwnd) {
        EmitSignalDeactivateDialog();
-       new SMESHGUI_EditMeshDlg(this,
-                                 "SMESH_MERGE_ELEMENTS_TITLE",
-                                 "ICON_DLG_MERGE_ELEMENTS",
-                                 1); // MergeEqualElemets
+       new SMESHGUI_EditMeshDlg( this, 1 );
       } else {
        SUIT_MessageBox::warn1(desktop(),
                              tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"),
@@ -2347,9 +2404,11 @@ void SMESHGUI::initialize( CAM_Application* app )
   createSMESHAction(  121, "DAT" );
   createSMESHAction(  122, "MED" );
   createSMESHAction(  123, "UNV" );
+  createSMESHAction(  140, "STL" );
   createSMESHAction(  124, "EXPORT_DAT" );
   createSMESHAction(  125, "EXPORT_MED" );
   createSMESHAction(  126, "EXPORT_UNV" );
+  createSMESHAction(  141, "EXPORT_STL" );
   createSMESHAction(   33, "DELETE",          "ICON_DELETE" );
   createSMESHAction( 5105, "SEL_FILTER_LIB" );
   createSMESHAction(  701, "COMPUTE",         "ICON_COMPUTE" );
@@ -2472,6 +2531,7 @@ void SMESHGUI::initialize( CAM_Application* app )
   createMenu( 121, exportId, -1 );
   createMenu( 122, exportId, -1 );
   createMenu( 123, exportId, -1 );
+  createMenu( 140, exportId, -1 ); // export to stl STL
 
   createMenu( separator(), fileId, 10 );
 
@@ -2693,6 +2753,7 @@ void SMESHGUI::initialize( CAM_Application* app )
   QString only_one_non_empty = QString( " && %1=1 && numberOfNodes>0" ).arg( QtxPopupMgr::Selection::defSelCountParam() );
   createPopupItem( 125, OB, mesh, only_one_non_empty );    // EXPORT_MED
   createPopupItem( 126, OB, mesh, only_one_non_empty );    // EXPORT_UNV
+  createPopupItem( 141, OB, mesh, only_one_non_empty );    // EXPORT_STL
   createPopupItem( 33, OB, subMesh + " " + group );        // DELETE
   popupMgr()->insert( separator(), -1, 0 );
 
@@ -3296,6 +3357,9 @@ LightApp_Operation* SMESHGUI::createOperation( const int id ) const
   // to do : create operation here
   switch( id )
   {
+    case 701: // Compute mesh
+      op = new SMESHGUI_ComputeOp();
+    break;
     case 702: // Create mesh
       op = new SMESHGUI_MeshOp( true, true );
     break;