Salome HOME
PAL17644: automatic actor's entity mode
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_GroupDlg.cxx
index 3416545670fba49be3262444ed23b266d99ae1b5..8bab9ee23522329247f8a9f869ff5462f2f22c21 100644 (file)
@@ -88,6 +88,7 @@
 // STL includes
 #include <vector>
 #include <algorithm>
+#include <set>
 
 using namespace std;
 
@@ -103,7 +104,8 @@ SMESHGUI_GroupDlg::SMESHGUI_GroupDlg( SMESHGUI* theModule, const char* name,
      mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ),
      mySelector(SMESH::GetViewWindow( theModule )->GetSelector()),
      myIsBusy( false ),
-     myActor( 0 )
+     myActor( 0 ),
+     myOldActorMode( -1 )
 {
   if (!name) setName("SMESHGUI_GroupDlg");
   initDialog(true);
@@ -421,6 +423,7 @@ void SMESHGUI_GroupDlg::initDialog(bool create)
     myTypeGroup->setButton(0);
 
   updateButtons();
+  //myName->setText(GetDefaultName(tr("SMESH_GROUP")));
 }
 
 //=================================================================================
@@ -437,6 +440,43 @@ SMESHGUI_GroupDlg::~SMESHGUI_GroupDlg()
   }
 }
 
+//=================================================================================
+// function : GetDefaultName()
+// purpose  : Get the Group Name if Create new Group
+//=================================================================================
+QString SMESHGUI_GroupDlg::GetDefaultName(const QString& theOperation)
+{
+    QString aName = "";
+
+    // collect all object names of SMESH component
+    SalomeApp_Study* appStudy =
+      dynamic_cast<SalomeApp_Study*>( SUIT_Session::session()->activeApplication()->activeStudy() );
+    if ( !appStudy ) return aName;
+    _PTR(Study) aStudy = appStudy->studyDS();
+
+    std::set<std::string> aSet;
+    _PTR(SComponent) aMeshCompo (aStudy->FindComponent("SMESH"));
+    if (aMeshCompo) {
+      _PTR(ChildIterator) it (aStudy->NewChildIterator(aMeshCompo));
+      _PTR(SObject) obj;
+      for (it->InitEx(true); it->More(); it->Next()) {
+       obj = it->Value();
+       aSet.insert(obj->GetName());
+      }
+    }
+
+    // build a unique name
+    int aNumber = 0;
+    bool isUnique = false;
+    while (!isUnique) {
+      aName = theOperation + "_" + QString::number(++aNumber);
+      isUnique = (aSet.count(aName.latin1()) == 0);
+    }
+
+    return aName;
+}
+
+
 //=================================================================================
 // function : Init()
 // purpose  :
@@ -452,6 +492,7 @@ void SMESHGUI_GroupDlg::init (SMESH::SMESH_Mesh_ptr theMesh)
 
   myActor = SMESH::FindActorByObject(myMesh);
   SMESH::SetPickable(myActor);
+  storeMode();
 
   SALOME_ListIO aList;
   mySelectionMgr->selectedObjects( aList );
@@ -478,6 +519,7 @@ void SMESHGUI_GroupDlg::init (SMESH::SMESH_GroupBase_ptr theGroup)
   
   myName->setText(theGroup->GetName());
   myName->home(false);
+  myOldName = myName->text();
 
   myColorSpinBox->setValue( theGroup->GetColorNumber() );
   
@@ -496,13 +538,14 @@ void SMESHGUI_GroupDlg::init (SMESH::SMESH_GroupBase_ptr theGroup)
 
   if ( !myGroup->_is_nil() )
     {
-      myGrpTypeGroup->setButton(0);
-      onGrpTypeChanged(0);
-
       myActor = SMESH::FindActorByObject(myMesh);
       if ( !myActor )
        myActor = SMESH::FindActorByObject(myGroup);
       SMESH::SetPickable(myActor);
+      storeMode();
+      
+      myGrpTypeGroup->setButton(0);
+      onGrpTypeChanged(0);
       
       myCurrentLineEdit = 0;
       myElements->clear();
@@ -526,13 +569,14 @@ void SMESHGUI_GroupDlg::init (SMESH::SMESH_GroupBase_ptr theGroup)
       
       if ( !myGroupOnGeom->_is_nil() )
        {
-         myGrpTypeGroup->setButton(1);
-         onGrpTypeChanged(1);
-
          myActor = SMESH::FindActorByObject(myMesh);
          if ( !myActor )
            myActor = SMESH::FindActorByObject(myGroup);
          SMESH::SetPickable(myActor);
+          storeMode();
+
+         myGrpTypeGroup->setButton(1);
+         onGrpTypeChanged(1);
          
          QString aShapeName("");
          _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
@@ -543,6 +587,8 @@ void SMESHGUI_GroupDlg::init (SMESH::SMESH_GroupBase_ptr theGroup)
              aShapeName = aGroupShapeSO->GetName().c_str();
            }
          myGeomGroupLine->setText( aShapeName );
+         myName->setText("Group On " + aShapeName);
+         cout << aShapeName << endl;
        }
     }
 }
@@ -553,15 +599,18 @@ void SMESHGUI_GroupDlg::init (SMESH::SMESH_GroupBase_ptr theGroup)
 //=================================================================================
 void SMESHGUI_GroupDlg::updateButtons()
 {
-  bool enable;
+  bool enable = !myName->text().stripWhiteSpace().isEmpty();
 
-  if (myGrpTypeId == 0)
-    enable = !myName->text().stripWhiteSpace().isEmpty() && myElements->count() > 0;
-  else if (myGrpTypeId == 1)
-    {
-      bool isEditMode = !CORBA::is_nil( myGroupOnGeom );
-      enable = !myName->text().stripWhiteSpace().isEmpty() && (myGeomObjects->length() > 0 || isEditMode);
+  if (myGrpTypeId == 0) {
+    enable = enable && myElements->count() > 0;
+    enable = enable && (!myGroup->_is_nil() || !myMesh->_is_nil());
+  }
+  else if (myGrpTypeId == 1) {
+    if (CORBA::is_nil(myGroupOnGeom)) { // creation mode
+      enable = enable && myGeomObjects->length() > 0 && !myMesh->_is_nil();
     }
+  }
+
   QPushButton* aBtn;
   aBtn = (QPushButton*) child("ok", "QPushButton");
   if (aBtn) aBtn->setEnabled(enable);
@@ -593,8 +642,27 @@ void SMESHGUI_GroupDlg::onNbColorsChanged (const QString& text)
 //=================================================================================
 void SMESHGUI_GroupDlg::onTypeChanged (int id)
 {
-  if (myTypeId != id) {
+  if (myTypeId != id)
+  {
     myElements->clear();
+    unsigned int aMode = -1;
+    switch( id )
+    {
+    case 0://node
+      aMode = SMESH_Actor::eAllEntity;
+      break;
+    case 1://edge
+      aMode = SMESH_Actor::eEdges;
+      break;
+    case 2://face
+      aMode = SMESH_Actor::eFaces;
+      break;
+    case 3://volume
+      aMode = SMESH_Actor::eVolumes;
+      break;
+    }
+    if( myActor && aMode>=0 )
+      myActor->SetEntityMode( aMode );
     if (myCurrentLineEdit == 0)
       setSelectionMode(id);
   }
@@ -609,6 +677,8 @@ void SMESHGUI_GroupDlg::onGrpTypeChanged (int id)
 {
   if (myGrpTypeId != id) {
     myWGStack->raiseWidget( id );
+    if (id == 0)
+      myName->setText(myOldName);
     onSelectGeomGroup(id == 1);
   }
   myGrpTypeId = id;
@@ -678,18 +748,27 @@ bool SMESHGUI_GroupDlg::onApply()
   if (mySMESHGUI->isActiveStudyLocked())
     return false;
 
-  if (myGrpTypeId == 0 &&
-      !myName->text().stripWhiteSpace().isEmpty() &&
-      myElements->count() > 0) {
+  if (myName->text().stripWhiteSpace().isEmpty())
+    return false;
+
+  if (myGrpTypeId == 0) { // on mesh elements
+    if (!myElements->count())
+      return false;
+
     mySelectionMgr->clearSelected();
-    if (myGroup->_is_nil()) {
+
+    if (myGroup->_is_nil()) { // creation
+      if (myMesh->_is_nil())
+        return false;
+
       SMESH::ElementType aType = SMESH::ALL;
-      switch(myTypeId) {
+      switch (myTypeId) {
       case 0: aType = SMESH::NODE; break;
       case 1: aType = SMESH::EDGE; break;
       case 2: aType = SMESH::FACE; break;
       case 3: aType = SMESH::VOLUME; break;
       }
+
       SMESH::long_array_var anIdList = new SMESH::long_array;
       int i, k = myElements->count();
       anIdList->length(k);
@@ -700,23 +779,22 @@ bool SMESHGUI_GroupDlg::onApply()
 
       myGroup = SMESH::AddGroup(myMesh, aType, myName->text());
       myGroup->Add(anIdList.inout());
-      
+
       int aColorNumber = myColorSpinBox->value();
       myGroup->SetColorNumber(aColorNumber);
-      
+
       _PTR(SObject) aMeshGroupSO = SMESH::FindSObject(myGroup);
 
       SMESH::setFileName ( aMeshGroupSO, QString::number(myColorSpinBox->value()) );
-      
-      SMESH::setFileType ( aMeshGroupSO,"COULEURGROUP" );
-      
+      SMESH::setFileType ( aMeshGroupSO, "COULEURGROUP" );
+
       /* init for next operation */
       myName->setText("");
       myColorSpinBox->setValue(0);
       myElements->clear();
       myGroup = SMESH::SMESH_Group::_nil();
 
-    } else {
+    } else { // edition
       myGroup->SetName(myName->text());
         
       int aColorNumber = myColorSpinBox->value();
@@ -759,11 +837,12 @@ bool SMESHGUI_GroupDlg::onApply()
     SMESH::UpdateView(); // asv: fix of BUG PAL5515
     mySelectionMgr->clearSelected();
     return true;
-  } else if (myGrpTypeId == 1 &&
-             !myName->text().stripWhiteSpace().isEmpty() &&
-             (myGeomObjects->length() > 0 || !CORBA::is_nil(myGroupOnGeom)))
-  {
-    if (myGroupOnGeom->_is_nil()) {
+  }
+  else if (myGrpTypeId == 1) { // on geom object
+    if (CORBA::is_nil(myGroupOnGeom)) { // creation
+      if (myMesh->_is_nil() || !myGeomObjects->length())
+        return false;
+
       SMESH::ElementType aType = SMESH::ALL;
       switch (myTypeId) {
       case 0: aType = SMESH::NODE; break;
@@ -771,88 +850,85 @@ bool SMESHGUI_GroupDlg::onApply()
       case 2: aType = SMESH::FACE; break;
       case 3: aType = SMESH::VOLUME; break;
       }
-      
+
       _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
       GEOM::GEOM_IGroupOperations_var aGroupOp =
        SMESH::GetGEOMGen()->GetIGroupOperations(aStudy->StudyId());
-      
-      if (myGeomObjects->length() == 1)
+
+      if (myGeomObjects->length() == 1) {
        myGroupOnGeom = myMesh->CreateGroupFromGEOM(aType, myName->text(),myGeomObjects[0]);
-      else
-       {
-         SMESH::SMESH_Gen_var aSMESHGen = SMESHGUI::GetSMESHGen();
-         if ( aSMESHGen->_is_nil() )
-           return false;
+      }
+      else {
+        SMESH::SMESH_Gen_var aSMESHGen = SMESHGUI::GetSMESHGen();
+        if ( aSMESHGen->_is_nil() )
+          return false;
+
+        // create a geometry group
+        GEOM::GEOM_Gen_var geomGen = SMESH::GetGEOMGen();
+        _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
+
+        if (geomGen->_is_nil() || !aStudy)
+          return false;
+
+        GEOM::GEOM_IGroupOperations_var op =
+          geomGen->GetIGroupOperations(aStudy->StudyId());
+        if (op->_is_nil())
+          return false;
+
+        // check and add all selected GEOM objects: they must be
+        // a sub-shapes of the main GEOM and must be of one type
+        TopAbs_ShapeEnum aGroupType = TopAbs_SHAPE;
+        for ( int i =0; i < myGeomObjects->length(); i++) {
+          TopAbs_ShapeEnum aSubShapeType = (TopAbs_ShapeEnum)myGeomObjects[i]->GetShapeType();
+          if (i == 0)
+            aGroupType = aSubShapeType;
+          else if (aSubShapeType != aGroupType) {
+            aGroupType = TopAbs_SHAPE;
+            break;
+          }
+        }
 
-         // create a geometry group
-         GEOM::GEOM_Gen_var geomGen = SMESH::GetGEOMGen();
-         _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
+        GEOM::GEOM_Object_var aMeshShape = myMesh->GetShapeToMesh();
+        GEOM::GEOM_Object_var aGroupVar = op->CreateGroup(aMeshShape, aGroupType);
+        op->UnionList(aGroupVar, myGeomObjects);
+
+        if (op->IsDone()) {
+          // publish the GEOM group in study
+          QString aNewGeomGroupName ("Auto_group_for_");
+          aNewGeomGroupName += myName->text();
+          SALOMEDS::SObject_var aNewGroupSO =
+            geomGen->AddInStudy(aSMESHGen->GetCurrentStudy(), aGroupVar, aNewGeomGroupName, aMeshShape);
+        }
+
+        myGroupOnGeom = myMesh->CreateGroupFromGEOM(aType, myName->text(), aGroupVar);
+      }
 
-         if (geomGen->_is_nil() || !aStudy)
-           return false;
-
-         GEOM::GEOM_IGroupOperations_var op =
-           geomGen->GetIGroupOperations(aStudy->StudyId());
-         if (op->_is_nil())
-           return false;
-           
-         // check and add all selected GEOM objects: they must be
-         // a sub-shapes of the main GEOM and must be of one type
-         TopAbs_ShapeEnum aGroupType = TopAbs_SHAPE;
-         for ( int i =0; i < myGeomObjects->length(); i++)
-           {
-             TopAbs_ShapeEnum aSubShapeType = (TopAbs_ShapeEnum)myGeomObjects[i]->GetShapeType();
-             if (i == 0)
-               aGroupType = aSubShapeType;
-             else if (aSubShapeType != aGroupType)
-               {
-                 aGroupType = TopAbs_SHAPE;
-                 break;
-               }
-           }
-           
-         GEOM::GEOM_Object_var aMeshShape = myMesh->GetShapeToMesh();
-         GEOM::GEOM_Object_var aGroupVar = op->CreateGroup(aMeshShape, aGroupType);
-         op->UnionList(aGroupVar, myGeomObjects);
-
-         if (op->IsDone()) {
-           // publish the GEOM group in study
-           QString aNewGeomGroupName ("Auto_group_for_");
-           aNewGeomGroupName += myName->text();
-           SALOMEDS::SObject_var aNewGroupSO =
-             geomGen->AddInStudy(aSMESHGen->GetCurrentStudy(), aGroupVar, aNewGeomGroupName, aMeshShape);
-         }
-         
-         myGroupOnGeom = myMesh->CreateGroupFromGEOM(aType, myName->text(), aGroupVar);
-               }
-      
       int aColorNumber = myColorSpinBox->value();
       myGroupOnGeom->SetColorNumber(aColorNumber);
-      
+
       _PTR(SObject) aMeshGroupSO = SMESH::FindSObject(myGroupOnGeom);
-      
+
       SMESH::setFileName ( aMeshGroupSO, QString::number(myColorSpinBox->value()) );
-      
+
       SMESH::setFileType ( aMeshGroupSO,"COULEURGROUP" );
-      
+
       /* init for next operation */
       myName->setText("");
       myColorSpinBox->setValue(0);
       myGroupOnGeom = SMESH::SMESH_GroupOnGeom::_nil();
     }
-    else
-      {
-       myGroupOnGeom->SetName(myName->text());
-        
-       int aColorNumber = myColorSpinBox->value();
-       myGroupOnGeom->SetColorNumber(aColorNumber);
-      }
-    
+    else { // edition
+      myGroupOnGeom->SetName(myName->text());
+
+      int aColorNumber = myColorSpinBox->value();
+      myGroupOnGeom->SetColorNumber(aColorNumber);
+    }
+
     mySMESHGUI->updateObjBrowser(true);
     mySelectionMgr->clearSelected();
     return true;
   }
-  
+
   return false;
 }
 
@@ -924,6 +1000,9 @@ void SMESHGUI_GroupDlg::onObjectSelectionChanged()
       myGeomGroupBtn->setEnabled(false);
       myGeomGroupLine->setEnabled(false);
       myGeomGroupLine->setText("");
+      myGeomObjects = new GEOM::ListOfGO();
+      myGeomObjects->length(0);
+
       if (myGeomGroupBtn->isOn())
        myGeomGroupBtn->setOn(false);
       if (!myCreate)
@@ -936,6 +1015,7 @@ void SMESHGUI_GroupDlg::onObjectSelectionChanged()
        myGroupOnGeom = SMESH::SMESH_GroupOnGeom::_nil(); 
         myMesh = SMESH::SMESH_Mesh::_nil();
        updateGeomPopup();
+        updateButtons();
         myIsBusy = false;
         return;
       }
@@ -946,6 +1026,7 @@ void SMESHGUI_GroupDlg::onObjectSelectionChanged()
        updateGeomPopup();
         if (myMesh->_is_nil())
        {
+          updateButtons();
          myIsBusy = false;
          return;
        }
@@ -953,6 +1034,7 @@ void SMESHGUI_GroupDlg::onObjectSelectionChanged()
 
         myActor = SMESH::FindActorByObject(myMesh);
         SMESH::SetPickable(myActor);
+        storeMode();
 
         aString = aList.First()->getName();
         myMeshGroupLine->setText(aString) ;
@@ -1001,19 +1083,20 @@ void SMESHGUI_GroupDlg::onObjectSelectionChanged()
       return;
 
     } else if (myCurrentLineEdit == myGeomGroupLine) {
-      
+
       myGeomObjects = new GEOM::ListOfGO();
-      
+
       // The mesh SObject
       _PTR(SObject) aMeshSO = SMESH::FindSObject(myMesh);
-      
+
       if (aNbSel == 0 || !aMeshSO)
        {
          myGeomObjects->length(0);
+          updateButtons();
          myIsBusy = false;
          return;
        }
-      
+
       myGeomObjects->length(aNbSel);
 
       GEOM::GEOM_Object_var aGeomGroup;
@@ -1093,6 +1176,8 @@ void SMESHGUI_GroupDlg::onObjectSelectionChanged()
     }
 
     myCurrentLineEdit->setText(aString);
+    myOldName = myName->text();
+    myName->setText(aString);
     myCurrentLineEdit->home(false);
 
     updateButtons();
@@ -1124,6 +1209,7 @@ void SMESHGUI_GroupDlg::onObjectSelectionChanged()
       myActor = SMESH::FindActorByObject(myGroupOnGeom);
     else
       myActor = SMESH::FindActorByObject(myMesh);
+    storeMode();
   }
 
   myIsBusy = false;
@@ -1634,7 +1720,8 @@ void SMESHGUI_GroupDlg::onClose()
     aViewWindow->SetSelectionMode(ActorSelection);
   mySelectionMgr->clearFilters();
   mySMESHGUI->ResetState();
-
+  if( myActor && myOldActorMode>=0 )
+    myActor->SetEntityMode( myOldActorMode );
   reject();
 }
 
@@ -1833,3 +1920,9 @@ void SMESHGUI_GroupDlg::onCloseShapeByMeshDlg(SUIT_Operation* op)
       setSelectionMode(7);
     }
 }
+
+void SMESHGUI_GroupDlg::storeMode()
+{
+  if( myActor )
+    myOldActorMode = myActor->GetEntityMode();
+}