Salome HOME
Merge branch 'occ/shaper2smesh'
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_GroupOnShapeDlg.cxx
index c85a269df519848876fedd33013fec7b55d5d1f6..9054ad855a30fb13ff598b7e4ac2b3b34e30630d 100644 (file)
@@ -1,24 +1,22 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2019  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
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
 //
-//  This library is free software; you can redistribute it and/or
-//  modify it under the terms of the GNU Lesser General Public
-//  License as published by the Free Software Foundation; either
-//  version 2.1 of the License.
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
 //
-//  This library is distributed in the hope that it will be useful,
-//  but WITHOUT ANY WARRANTY; without even the implied warranty of
-//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-//  Lesser General Public License for more details.
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 //
-//  You should have received a copy of the GNU Lesser General Public
-//  License along with this library; if not, write to the Free Software
-//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-//
-//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //  SMESH SMESHGUI : GUI for SMESH component
 // File      : SMESHGUI_GroupOnShapeDlg.cxx
 // Created   : Wed Sep 17 18:36:51 2008
 #include "SMESHGUI_GroupOnShapeDlg.h"
 
 #include "SMESH_TypeFilter.hxx"
+#include "SMESHGUI.h"
 #include "SMESHGUI_Utils.h"
 #include "SMESHGUI_GEOMGenUtils.h"
 
 #include <GeometryGUI.h>
 #include <GEOM_SelectionFilter.h>
+#include <GEOM_wrap.hxx>
 
 #include <SUIT_Session.h>
 #include <SUIT_OverrideCursor.h>
+#include <LightApp_Application.h>
 #include <LightApp_UpdateFlags.h>
 #include <SUIT_ResourceMgr.h>
 
@@ -76,7 +77,8 @@ SMESHGUI_GroupOnShapeDlg::SMESHGUI_GroupOnShapeDlg()
 
   // Elem geom
 
-  QGroupBox* elemsGrp = new QGroupBox( tr( "SMESH_ELEMENTS" ), mainFrame() );
+  QGroupBox* elemsGrp = new QGroupBox( tr( "ELEMENTS" ), mainFrame() );
+  elemsGrp->setToolTip( tr("ELEMENTS_TOOLTIP") );
   QLabel* label = new QLabel( tr( "SMESH_GEOM" ), elemsGrp );
   myElemGeomBtn = new QPushButton( elemsGrp );
   myElemGeomBtn->setCheckable(true);
@@ -132,7 +134,7 @@ SMESHGUI_GroupOnShapeDlg::~SMESHGUI_GroupOnShapeDlg()
 
 //================================================================================
 /*!
- * \brief slot to enable/diable [Apply]
+ * \brief slot to enable/disable [Apply]
  */
 //================================================================================
 
@@ -178,7 +180,7 @@ SMESHGUI_GroupOnShapeOp::SMESHGUI_GroupOnShapeOp()
   : SMESHGUI_SelectionOp(ActorSelection),
     myDlg( 0 )
 {
-  myHelpFileName = "creating_groups_page.html";
+  myHelpFileName = "create_groups_from_geometry.html";
 }
 
 SMESHGUI_GroupOnShapeOp::~SMESHGUI_GroupOnShapeOp()
@@ -204,11 +206,11 @@ LightApp_Dialog* SMESHGUI_GroupOnShapeOp::dlg() const
  */
 //================================================================================
 
-static SMESH::ElementType elementType(GEOM::GEOM_Object_var& geom)
+SMESH::ElementType SMESHGUI_GroupOnShapeOp::ElementType(GEOM::GEOM_Object_var geom)
 {
   if ( !geom->_is_nil() ) {
     switch ( geom->GetShapeType() ) {
-    case GEOM::VERTEX:   return SMESH::NODE;
+    case GEOM::VERTEX:   return SMESH::ELEM0D; // NODE; -- 0023613
     case GEOM::EDGE:     return SMESH::EDGE;
     case GEOM::WIRE:     return SMESH::EDGE;
     case GEOM::FACE:     return SMESH::FACE;
@@ -218,27 +220,28 @@ static SMESH::ElementType elementType(GEOM::GEOM_Object_var& geom)
     case GEOM::COMPOUND: break;
     default:             return SMESH::ALL;
     }
-    _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
-    GEOM::GEOM_IShapesOperations_var aShapeOp =
-      SMESH::GetGEOMGen()->GetIShapesOperations(aStudy->StudyId());
+    GEOM::GEOM_Gen_var                 geomGen = SMESH::GetGEOMGen( geom );
+    GEOM::GEOM_IShapesOperations_wrap aShapeOp = geomGen->GetIShapesOperations();
 
-    if ( geom->GetType() == 37 ) // geom group
-      GEOM::GEOM_IGroupOperations_var  aGroupOp =
-        SMESH::GetGEOMGen()->GetIGroupOperations(aStudy->StudyId());
+    if ( geom->GetType() == 37 ) // geom group
+    {
+      GEOM::GEOM_IGroupOperations_ptr aGroupOp = geomGen->GetIGroupOperations();
       if ( !aGroupOp->_is_nil() ) {
+        // mainShape is an existing servant => GEOM_Object_var not GEOM_Object_wrap
         GEOM::GEOM_Object_var mainShape = aGroupOp->GetMainShape( geom );
         GEOM::ListOfLong_var        ids = aGroupOp->GetObjects( geom );
         if ( ids->length() && !mainShape->_is_nil() && !aShapeOp->_is_nil() ) {
-          GEOM::GEOM_Object_var member = aShapeOp->GetSubShape( mainShape, ids[0] );
-          return elementType( member );
+          GEOM::GEOM_Object_wrap member = aShapeOp->GetSubShape( mainShape, ids[0] );
+          return ElementType( member );
         }
       }
     }
-    else if ( !aShapeOp->_is_nil() ) { // just a compoud shape
+    else if ( !aShapeOp->_is_nil() ) // just a compoud shape
+    {
       GEOM::ListOfLong_var ids = aShapeOp->SubShapeAllIDs( geom, GEOM::SHAPE, false );
       if ( ids->length() ) {
-        GEOM::GEOM_Object_var member = aShapeOp->GetSubShape( geom, ids[0] );
-        return elementType( member );
+        GEOM::GEOM_Object_wrap member = aShapeOp->GetSubShape( geom, ids[0] );
+        return ElementType( member );
       }
     }
   }
@@ -294,15 +297,15 @@ bool SMESHGUI_GroupOnShapeOp::onApply()
 {
   SUIT_OverrideCursor aWaitCursor;
 
-  if (isStudyLocked())
+  if (SMESHGUI::isStudyLocked())
     return false;
 
   // study
-  _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
+  _PTR(Study) aStudy = SMESH::getStudy();
   if ( !aStudy ) return false;
 
   // mesh
-  _PTR(SObject)       meshSO = aStudy->FindObjectID( myMeshID.toLatin1().data() );
+  _PTR(SObject) meshSO = aStudy->FindObjectID( myMeshID.toUtf8().data() );
   SMESH::SMESH_Mesh_var mesh = SMESH::SObjectToInterface<SMESH::SMESH_Mesh>( meshSO );
   if ( mesh->_is_nil() ) return false;
 
@@ -319,6 +322,7 @@ bool SMESHGUI_GroupOnShapeOp::onApply()
 
   // create groups
   SMESH::SMESH_GroupOnGeom_var group;
+  QStringList anEntryList;
   for ( int isNode = 0; isNode < 2; ++isNode ) // elems and then nodes
   {
     QStringList::iterator geomID = isNode ? myNodeGeoIDs.begin() : myElemGeoIDs.begin();
@@ -327,12 +331,12 @@ bool SMESHGUI_GroupOnShapeOp::onApply()
     for ( int i = 0; geomID != geomEnd; ++geomID, ++i )
     {
       // selected geom
-      _PTR(SObject) geomSO = aStudy->FindObjectID( geomID->toLatin1().data() );
+      _PTR(SObject) geomSO = aStudy->FindObjectID( geomID->toUtf8().data() );
       GEOM::GEOM_Object_var geom = SMESH::SObjectToInterface<GEOM::GEOM_Object>(geomSO);
       if ( geom->_is_nil() ) continue;
 
       // group type
-      SMESH::ElementType elemType = isNode ? SMESH::NODE : elementType( geom );
+      SMESH::ElementType elemType = isNode ? SMESH::NODE : ElementType( geom );
       if ( elemType == SMESH::ALL )
         continue;
 
@@ -346,12 +350,29 @@ bool SMESHGUI_GroupOnShapeOp::onApply()
 //       groupNames.append( name );
 
       //printf( "apply() %s %s\n", (*geomID).latin1(), name.latin1() );
-      group = mesh->CreateGroupFromGEOM( elemType, name.toLatin1().data(), geom );
+      group = mesh->CreateGroupFromGEOM( elemType, name.toUtf8().data(), geom );
+      if( !group->_is_nil() )
+        if( _PTR(SObject) aSObject = SMESH::ObjectToSObject( group ) )
+          anEntryList.append( aSObject->GetID().c_str() );
     }
   }
+  SMESHGUI::Modified();
+
   update( UF_ObjBrowser | UF_Model );
 
-  init();
+  // Re-init controls to create the next group
+  myElemGeoIDs.clear();
+  myNodeGeoIDs.clear();
+  removeCustomFilters();
+  myDlg->myNodeGeomList->clear();
+  myDlg->myElemGeomList->clear();
+  myDlg->myElemGeomBtn->setChecked(false); 
+  myDlg->myNodeGeomBtn->setChecked(false);
+  myDlg->updateButtons();
+
+  if( LightApp_Application* anApp =
+      dynamic_cast<LightApp_Application*>( SUIT_Session::session()->activeApplication() ) )
+    anApp->browseObjects( anEntryList, isApplyAndClose() );
 
   return !group->_is_nil();
 }
@@ -401,7 +422,7 @@ SUIT_SelectionFilter* SMESHGUI_GroupOnShapeOp::createFilter( const int theId ) c
   if ( theId == _ELEM_GEOM || theId == _NODE_GEOM )
     return new GEOM_SelectionFilter( (SalomeApp_Study*)study(), true );
   else if ( theId == _MESH )
-    return new SMESH_TypeFilter( MESH );
+    return new SMESH_TypeFilter( SMESH::MESH );
   else
     return ( SUIT_SelectionFilter*) 0;
 }
@@ -431,6 +452,7 @@ void SMESHGUI_GroupOnShapeOp::selectionDone()
     myDlg->myElemGeomBtn->setEnabled( nbSelected == 1 );
     myDlg->myNodeGeomList->clear();
     myDlg->myNodeGeomBtn->setEnabled( nbSelected == 1 );
+    myDlg->myElemGeomBtn->click();
     return;
   }
 
@@ -439,9 +461,9 @@ void SMESHGUI_GroupOnShapeOp::selectionDone()
   QStringList goodNames, goodIds;
   if (nbSelected > 0) {
     // study
-    if (_PTR(Study) aStudy = SMESH::GetActiveStudyDocument()) {
+    if (_PTR(Study) aStudy = SMESH::getStudy()) {
       // mesh
-      if (_PTR(SObject)  meshSO = aStudy->FindObjectID( myMeshID.toLatin1().data() )) {
+      if (_PTR(SObject)  meshSO = aStudy->FindObjectID( myMeshID.toUtf8().data() )) {
         // shape to mesh
         _PTR(SObject) anObj, shapeToMesh;
         if (meshSO->FindSubObject(1, anObj) && anObj->ReferencedObject(shapeToMesh)) {
@@ -449,7 +471,7 @@ void SMESHGUI_GroupOnShapeOp::selectionDone()
           QStringList::iterator name = names.begin(), id = ids.begin(), idEnd = ids.end();
           for (; id != idEnd; ++id, ++name ) {
             // shape SO
-            if (_PTR(SObject) shapeSO = aStudy->FindObjectID( id->toLatin1().data() )) {
+            if (_PTR(SObject) shapeSO = aStudy->FindObjectID( id->toUtf8().data() )) {
             // check if shape SO is a child of shape to mesh 
               while ( shapeSO && shapeSO->GetID() != shapeToMesh->GetID() )
                 if  ( shapeSO->Depth() < 2 )
@@ -470,19 +492,19 @@ void SMESHGUI_GroupOnShapeOp::selectionDone()
     }
   }
 
-  if ( myDlg->myElemGeomBtn->isChecked() ) // elem geomerty selection
+  if ( myDlg->myElemGeomBtn->isChecked() ) // elem geometry selection
   {
     myDlg->myElemGeomList->clear();
     myDlg->myElemGeomList->addItems( goodNames );
     myElemGeoIDs = goodIds;
   }
-  else if ( myDlg->myNodeGeomBtn->isChecked() ) // Node geomerty selection
+  else if ( myDlg->myNodeGeomBtn->isChecked() ) // Node geometry selection
   {
     myDlg->myNodeGeomList->clear();
     myDlg->myNodeGeomList->addItems( goodNames );
     myNodeGeoIDs = goodIds;
   }
 
-  // enable/diable Apply, which can change at selection
+  // enable/disable Apply, which can change at selection
   myDlg->updateButtons();
 }