Salome HOME
PAL9878 - selection lost after some operations
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_CreatePolyhedralVolumeDlg.cxx
index 3a572c897d9f2eca6766a8fde1fab83816b57e94..157a05b0fc8c3a04b29a0e02cec9fe97ceabb7c9 100644 (file)
 #include "SMESH_TypeFilter.hxx"
 #include "SMDS_Mesh.hxx"
 
-#include "VTKViewer_ViewWindow.h"
-
 #include "SUIT_ResourceMgr.h"
 
 #include "SalomeApp_Application.h"
 #include "SalomeApp_Study.h"
 #include "SUIT_Desktop.h"
 #include "SUIT_MessageBox.h"
-#include "SalomeApp_SelectionMgr.h"
+#include "LightApp_SelectionMgr.h"
 #include "utilities.h"
 
 #include "SVTK_ViewWindow.h"
@@ -112,19 +110,15 @@ class TPolySimulation{
       myPreviewActor->VisibilityOff();
       myPreviewActor->SetMapper( myMapper );
 
-      vtkProperty* aProp = vtkProperty::New();
       float anRGB[3];
-      anRGB[0] = GetFloat("SMESH:SettingsFillColorRed", 0)/255.;
-      anRGB[1] = GetFloat("SMESH:SettingsFillColorGreen", 170)/255.;
-      anRGB[2] = GetFloat("SMESH:SettingsFillColorBlue", 255)/255.;
+      vtkProperty* aProp = vtkProperty::New();
+      GetColor( "SMESH", "fill_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 170, 255 ) );
       aProp->SetColor(anRGB[0],anRGB[1],anRGB[2]);
       myPreviewActor->SetProperty( aProp );
       aProp->Delete();
 
       vtkProperty* aBackProp = vtkProperty::New();
-      anRGB[0] = GetFloat("SMESH:SettingsBackFaceColorRed", 0)/255.;
-      anRGB[1] = GetFloat("SMESH:SettingsBackFaceColorGreen", 0)/255.;
-      anRGB[2] = GetFloat("SMESH:SettingsBackFaceColorBlue", 255)/255.;
+      GetColor( "SMESH", "backface_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 0, 255 ) );
       aBackProp->SetColor(anRGB[0],anRGB[1],anRGB[2]);
       myPreviewActor->SetBackfaceProperty( aBackProp );
       aBackProp->Delete();
@@ -151,11 +145,15 @@ class TPolySimulation{
        anIds->InsertId(i,theIds[i]);
 
       myGrid->InsertNextCell(theType,anIds);
+      if(theIds.size()!=0){
+       myGrid->InsertNextCell(theType,anIds);
+       myGrid->Modified();
+      }
+       
       anIds->Delete();
 
-      myGrid->Modified();
-
       SetVisibility(true);
+
     }
   
     void ResetGrid(bool theReset=true){
@@ -191,11 +189,9 @@ SMESHGUI_CreatePolyhedralVolumeDlg::SMESHGUI_CreatePolyhedralVolumeDlg( SMESHGUI
                                                                        bool modal, WFlags fl )
   : QDialog( SMESH::GetDesktop( theModule ), name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu | Qt::WDestructiveClose),
     mySMESHGUI( theModule ),
-    mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ),
-    myViewWindow( SMESH::GetViewWindow( theModule ) ),
-    mySelector( myViewWindow->GetSelector() )
+    mySelectionMgr( SMESH::GetSelectionMgr( theModule ) )
 {
-  QPixmap image0( SMESHGUI::resourceMgr()->loadPixmap( "SMESH",tr("ICON_SELECT")));
+  QPixmap image0( SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap( "SMESH",tr("ICON_SELECT")));
 
   if ( !name )
     setName( "SMESHGUI_CreatePolyhedralVolumeDlg" );
@@ -310,6 +306,8 @@ SMESHGUI_CreatePolyhedralVolumeDlg::SMESHGUI_CreatePolyhedralVolumeDlg( SMESHGUI
   Preview = new QCheckBox( GroupContent, "Preview" );
   Preview->setText( tr( "SMESH_POLYEDRE_PREVIEW"  ) );
   GroupContentLayout->addWidget( Preview , 5, 0 );
+
+  mySelector = (SMESH::GetViewWindow( mySMESHGUI ))->GetSelector();
   
   SMESHGUI_CreatePolyhedralVolumeDlgLayout->addWidget( GroupContent, 1, 0 );
   
@@ -382,8 +380,10 @@ void SMESHGUI_CreatePolyhedralVolumeDlg::Init()
 //=================================================================================
 void SMESHGUI_CreatePolyhedralVolumeDlg::ConstructorsClicked(int constructorId)
 {
-  disconnect(mySelectionMgr, 0, this, 0);
+  //disconnect(mySelectionMgr, 0, this, 0);
 
+  SALOME_ListIO io;
+  mySelectionMgr->selectedObjects( io );
   SALOME_ListIO aList;
   mySelectionMgr->setSelectedObjects( aList );
   myEditCurrentArgument->clear();
@@ -398,10 +398,13 @@ void SMESHGUI_CreatePolyhedralVolumeDlg::ConstructorsClicked(int constructorId)
       { 
        if ( myActor ){
           myActor->SetPointRepresentation(true);
+         myActor->SetEntityMode(SMESH_Actor::eVolumes);
+         myActor->SetRepresentation(SMESH_Actor::eSurface);
        }
         else
           SMESH::SetPointRepresentation(true);
-       myViewWindow->SetSelectionMode(NodeSelection);
+       if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
+         aViewWindow->SetSelectionMode(NodeSelection);
        
        AddButton->setEnabled(false);
        RemoveButton->setEnabled(false);
@@ -416,8 +419,16 @@ void SMESHGUI_CreatePolyhedralVolumeDlg::ConstructorsClicked(int constructorId)
       }
     case 1 :
       {
-       SMESH::SetPointRepresentation(false);
-       myViewWindow->SetSelectionMode(FaceSelection);
+       if( myActor ){
+         myActor->SetPointRepresentation(false);
+         myActor->SetEntityMode(SMESH_Actor::eFaces);
+         myActor->SetEntityMode(SMESH_Actor::eVolumes);
+         myActor->SetRepresentation(SMESH_Actor::eSurface);
+       } else {
+         SMESH::SetPointRepresentation(false);
+       }
+       if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
+         aViewWindow->SetSelectionMode(FaceSelection);
        
        TextLabelIds->setText( tr( "SMESH_ID_FACES" ) );
        myFacesByNodesLabel->hide();
@@ -429,7 +440,8 @@ void SMESHGUI_CreatePolyhedralVolumeDlg::ConstructorsClicked(int constructorId)
       }
     }
   
-  connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
+  //connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
+  mySelectionMgr->setSelectedObjects( io );
 }
 
 //=================================================================================
@@ -514,8 +526,8 @@ void SMESHGUI_CreatePolyhedralVolumeDlg::ClickOnApply()
          }
        }
       
-      SALOME_ListIO aList;
-      mySelectionMgr->setSelectedObjects( aList );
+      //SALOME_ListIO aList;
+      //mySelectionMgr->setSelectedObjects( aList );
       mySimulation->SetVisibility(false);
       SMESH::UpdateView();
       ConstructorsClicked( GetConstructorId() );
@@ -541,11 +553,12 @@ void SMESHGUI_CreatePolyhedralVolumeDlg::ClickOnOk()
 void SMESHGUI_CreatePolyhedralVolumeDlg::ClickOnCancel()
 {
   mySelectionMgr->clearFilters();
-  SALOME_ListIO aList;
-  mySelectionMgr->setSelectedObjects( aList );
+  //SALOME_ListIO aList;
+  //mySelectionMgr->setSelectedObjects( aList );
   SMESH::SetPointRepresentation(false);
   mySimulation->SetVisibility(false);
-  myViewWindow->SetSelectionMode( ActorSelection );
+  if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
+    aViewWindow->SetSelectionMode( ActorSelection );
   disconnect( mySelectionMgr, 0, this, 0 );
   mySMESHGUI->ResetState() ;
   reject() ;
@@ -570,48 +583,30 @@ void SMESHGUI_CreatePolyhedralVolumeDlg::onTextChange(const QString& theNewText)
   if (GetConstructorId() == 0)
   {
     if ( aMesh ) {
-      SALOME_ListIO aList; aList.Append( myActor->getIO() );
-      mySelectionMgr->setSelectedObjects( aList );
-
-      TColStd_IndexedMapOfInteger selectedIndices;
       TColStd_MapOfInteger newIndices;
-      mySelector->GetIndex( myActor->getIO(), selectedIndices);
-
+      
       QStringList aListId = QStringList::split( " ", theNewText, false);
       for ( int i = 0; i < aListId.count(); i++ ) {
        const SMDS_MeshNode * n = aMesh->FindNode( aListId[ i ].toInt() );
        if ( n ) {
-           /*if ( mySelectionMgr->IsIndexSelected( myActor->getIO(), n->GetID() ))
-             allOk = false;
-           else
-             mySelectionMgr->AddOrRemoveIndex (myActor->getIO(), n->GetID(), true);*/
-         if (selectedIndices.Add(n->GetID()))
-           newIndices.Add(n->GetID());
+         newIndices.Add(n->GetID());
          myNbOkElements++;
         }
       }
-
-      if (newIndices.Extent() > 0){
-       mySelector->AddOrRemoveIndex( myActor->getIO(), newIndices, true );
-       myViewWindow->highlight( myActor->getIO(), true, true );
-      }
-
-/*     bool aNodesOK = false;
-       if (aListId.count() >= 3)
-         aNodesOK = true;
-
-       allOk = (allOk && aNodesOK);*/
-       
+      
+      mySelector->AddOrRemoveIndex( myActor->getIO(), newIndices, false );
+      
+      if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
+       aViewWindow->highlight( myActor->getIO(), true, true );
+      
       if ( myNbOkElements>0 && aListId.count()>=3)
        AddButton->setEnabled(true);
-       else
-         AddButton->setEnabled(false);
-
-//     if (allOk && !myOkElements)
-       displaySimulation();
-      }
+      else
+       AddButton->setEnabled(false);
+      
+      displaySimulation();
     }
-  else if (GetConstructorId() == 1)
+  else if (GetConstructorId() == 1)
   {
     myNbOkElements = 0;
     buttonOk->setEnabled( false );
@@ -620,33 +615,22 @@ void SMESHGUI_CreatePolyhedralVolumeDlg::onTextChange(const QString& theNewText)
       // check entered ids of faces and hilight them
     QStringList aListId;
     if ( aMesh ) {
-      SALOME_ListIO aList; aList.Append( myActor->getIO() );
-      mySelectionMgr->setSelectedObjects( aList );
-
-      TColStd_IndexedMapOfInteger selectedIndices;
       TColStd_MapOfInteger newIndices;
-      mySelector->GetIndex( myActor->getIO(), selectedIndices);
-
+      
       aListId = QStringList::split( " ", theNewText, false);
 
       for ( int i = 0; i < aListId.count(); i++ ) {
        const SMDS_MeshElement * e = aMesh->FindElement( aListId[ i ].toInt() );
        if ( e ) {
-         /*if ( mySelectionMgr->IsIndexSelected( myActor->getIO(), e->GetID() ))
-           myOkElements = false;
-         else
-           mySelectionMgr->AddOrRemoveIndex (myActor->getIO(), e->GetID(), true);*/
-         if (selectedIndices.Add(e->GetID()))
-             newIndices.Add(e->GetID());
+         newIndices.Add(e->GetID());
          myNbOkElements++;  
        }
       }
 
-      if (newIndices.Extent() > 0){
-       mySelector->AddOrRemoveIndex( myActor->getIO(), newIndices, true );
-       myViewWindow->highlight( myActor->getIO(), true, true );
-      }
-
+      mySelector->AddOrRemoveIndex( myActor->getIO(), newIndices, false );
+      if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
+       aViewWindow->highlight( myActor->getIO(), true, true );
+      
       if ( myNbOkElements ) {
        if (aListId.count()>1){ 
          buttonOk->setEnabled( true );
@@ -715,8 +699,9 @@ void SMESHGUI_CreatePolyhedralVolumeDlg::SelectionIntoArgument()
     int anbNodes = SMESH::GetNameOfSelectedNodes(mySelector, myActor->getIO(), aString);
     if (anbNodes >= 3)
       AddButton->setEnabled(true);
-    else 
-      break;
+    else if (anbNodes < 3){
+      AddButton->setEnabled(false);
+    }
     busy = true;
     myEditCurrentArgument->setText( aString );
     busy = false;
@@ -725,16 +710,19 @@ void SMESHGUI_CreatePolyhedralVolumeDlg::SelectionIntoArgument()
   case 1:{
     // get selected faces
     int aNbFaces = SMESH::GetNameOfSelectedElements(mySelector, myActor->getIO(), aString);
-    if (aNbFaces<=1)
-      return;
+    if (aNbFaces<=1){
+      buttonOk->setEnabled( false );
+      buttonApply->setEnabled( false );
+    } else {
+      buttonOk->setEnabled( true );
+      buttonApply->setEnabled( true );
+    }
     busy = true;
     myEditCurrentArgument->setText( aString );
     busy = false;
     
     // OK
     myNbOkElements = 1;
-    buttonOk->setEnabled( true );
-    buttonApply->setEnabled( true );
     break;
   }
   default: return;
@@ -772,6 +760,11 @@ void SMESHGUI_CreatePolyhedralVolumeDlg::displaySimulation()
              mySimulation->SetPosition(myActor, aType, aVTKIds_faces,false);
            }
          }
+         if(myFacesByNodes->count() == 0){
+           mySimulation->SetVisibility(false);
+         } else {
+           mySimulation->SetVisibility(true);
+         }
          if(Preview->isChecked()){
            mySimulation->SetPosition(myActor, aType, aVTKIds);
          }
@@ -818,7 +811,8 @@ void SMESHGUI_CreatePolyhedralVolumeDlg::displaySimulation()
            mySimulation->SetPosition(myActor, aType, aVTKIds);
        }
       }
-    }  
+      SMESH::UpdateView();
+    }
 }
 
 //=================================================================================
@@ -866,7 +860,8 @@ void SMESHGUI_CreatePolyhedralVolumeDlg::ActivateThisDialog()
   
   mySMESHGUI->SetActiveDialogBox( (QDialog*)this ) ;
 
-  myViewWindow->SetSelectionMode( FaceSelection );
+  if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
+    aViewWindow->SetSelectionMode( FaceSelection );
   SelectionIntoArgument();
 }
 
@@ -937,7 +932,6 @@ void SMESHGUI_CreatePolyhedralVolumeDlg::onAdd()
       myNbOkElements = 1;
       myEditCurrentArgument->clear();
       AddButton->setEnabled(false);
-      RemoveButton->setEnabled(true);
       buttonOk->setEnabled( true );
       if(myFacesByNodes->count()>1) buttonApply->setEnabled( true );
     }
@@ -956,22 +950,20 @@ void SMESHGUI_CreatePolyhedralVolumeDlg::onRemove()
   for (int i = myFacesByNodes->count(); i > 0; i--) {
     if (myFacesByNodes->isSelected(i-1)) {
       myFacesByNodes->removeItem(i-1);
+      myNbOkElements = 1;
     }
   }
   if (myFacesByNodes->count() < 1){
-    myNbOkElements = 0;
     RemoveButton->setEnabled(false);
     buttonOk->setEnabled( false );
     buttonApply->setEnabled( false );
   } 
   else if (myFacesByNodes->count() == 1){
-    myNbOkElements = 0;
     buttonOk->setEnabled( false );
     buttonApply->setEnabled( false );
   }
-  displaySimulation();
   busy = false;
-  onListSelectionChanged();
+  displaySimulation();
 }
 
 //=================================================================================
@@ -982,22 +974,27 @@ void SMESHGUI_CreatePolyhedralVolumeDlg::onListSelectionChanged()
 {
   if (busy || !myActor) return;
   busy = true;
-
-  SALOME_ListIO list;
-  mySelectionMgr->setSelectedObjects( list );
+  bool isSelected=false;
+  SALOME_ListIO aList;
+  mySelectionMgr->setSelectedObjects( aList );
   TColStd_MapOfInteger aIndexes;
   QListBoxItem* anItem;
   for (anItem = myFacesByNodes->firstItem(); anItem != 0; anItem = anItem->next()) {
     if (anItem->isSelected()) {
+      isSelected = true;
       QStringList anIds = QStringList::split(" ", anItem->text());
       for (QStringList::iterator it = anIds.begin(); it != anIds.end(); ++it)
        aIndexes.Add((*it).toInt());
     }
   }
+  if(isSelected) RemoveButton->setEnabled(true);
+  else RemoveButton->setEnabled(false);
   mySelector->AddOrRemoveIndex(myActor->getIO(), aIndexes, true );
-  myViewWindow->highlight( myActor->getIO(), true, true );
-  list.Append( myActor->getIO() );
-  mySelectionMgr->setSelectedObjects( list );
+  if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
+    aViewWindow->highlight( myActor->getIO(), true, true );
+  mySelectionMgr->clearFilters(); 
+  aList.Append( myActor->getIO() );
+  mySelectionMgr->setSelectedObjects( aList );
   
   busy = false;
 }