Salome HOME
0022123: EDF 2558 SMESH: Group creation crashs with the filter "Free faces":
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_AddMeshElementDlg.cxx
index 4403aa6bdff6a0522c88559ff0d860184a72da5b..ce220e259bc0ab6f427e78953483cd937a0b7bb8 100644 (file)
 #include "SMESHGUI_AddMeshElementDlg.h"
 
 #include "SMESHGUI.h"
-#include "SMESHGUI_Utils.h"
-#include "SMESHGUI_VTKUtils.h"
-#include "SMESHGUI_MeshUtils.h"
 #include "SMESHGUI_GroupUtils.h"
 #include "SMESHGUI_IdValidator.h"
+#include "SMESHGUI_MeshUtils.h"
+#include "SMESHGUI_SpinBox.h"
+#include "SMESHGUI_Utils.h"
+#include "SMESHGUI_VTKUtils.h"
 
 #include <SMESH_Actor.h>
 #include <SMESH_ActorUtils.h>
@@ -241,6 +242,12 @@ SMESHGUI_AddMeshElementDlg::SMESHGUI_AddMeshElementDlg( SMESHGUI*          theMo
     elemName = "ELEM0D";
     myHelpFileName = "adding_nodes_and_elements_page.html#adding_0delems_anchor";
     break;
+  case SMDSEntity_Ball:
+    myNbNodes = 1;
+    myElementType = SMDSAbs_Ball;
+    elemName = "BALL";
+    myHelpFileName = "adding_nodes_and_elements_page.html#adding_ball_anchor";
+    break;
   case SMDSEntity_Edge:
     myNbNodes = 2;
     myElementType = SMDSAbs_Edge;
@@ -312,7 +319,7 @@ SMESHGUI_AddMeshElementDlg::SMESHGUI_AddMeshElementDlg( SMESHGUI*          theMo
   aTopLayout->setSpacing(SPACING);
   aTopLayout->setMargin(MARGIN);
 
-  /***************************************************************/
+  /* Constructor *************************************************/
   GroupConstructors = new QGroupBox(buttonGrTitle, this);
   QButtonGroup* ButtonGroup = new QButtonGroup(this);
   QHBoxLayout* GroupConstructorsLayout = new QHBoxLayout(GroupConstructors);
@@ -326,7 +333,7 @@ SMESHGUI_AddMeshElementDlg::SMESHGUI_AddMeshElementDlg( SMESHGUI*          theMo
   GroupConstructorsLayout->addWidget(Constructor1);
   ButtonGroup->addButton( Constructor1, 0 );
 
-  /***************************************************************/
+  /* Nodes & Reverse *********************************************/
   GroupC1 = new QGroupBox(grBoxTitle, this);
   QGridLayout* GroupC1Layout = new QGridLayout(GroupC1);
   GroupC1Layout->setSpacing(SPACING);
@@ -336,16 +343,28 @@ SMESHGUI_AddMeshElementDlg::SMESHGUI_AddMeshElementDlg( SMESHGUI*          theMo
   SelectButtonC1A1 = new QPushButton(GroupC1);
   SelectButtonC1A1->setIcon(image1);
   LineEditC1A1 = new QLineEdit(GroupC1);
-  LineEditC1A1->setValidator(new SMESHGUI_IdValidator(this, myIsPoly ? 1000 : myNbNodes));
+  LineEditC1A1->setValidator
+    (new SMESHGUI_IdValidator(this, ( myIsPoly || myNbNodes == 1 ) ? 1000 : myNbNodes));
 
   Reverse = (myElementType == SMDSAbs_Face || myElementType == SMDSAbs_Volume ) ? new QCheckBox(tr("SMESH_REVERSE"), GroupC1) : 0;
 
+  DiameterSpinBox = ( myGeomType == SMDSEntity_Ball ) ? new SMESHGUI_SpinBox(GroupC1) : 0;
+  QLabel* diameterLabel = DiameterSpinBox ? new QLabel( tr("BALL_DIAMETER"),GroupC1) : 0;
+
   GroupC1Layout->addWidget(TextLabelC1A1,    0, 0);
   GroupC1Layout->addWidget(SelectButtonC1A1, 0, 1);
   GroupC1Layout->addWidget(LineEditC1A1,     0, 2);
-  if ( Reverse ) GroupC1Layout->addWidget(Reverse, 1, 0, 1, 3);
+  if ( Reverse ) {
+    GroupC1Layout->addWidget(Reverse, 1, 0, 1, 3);
+  }
+  if ( DiameterSpinBox ) {
+    GroupC1Layout->addWidget(diameterLabel,   1, 0);
+    GroupC1Layout->addWidget(DiameterSpinBox, 1, 1, 1, 2);
 
-  /***************************************************************/
+    DiameterSpinBox->RangeStepAndValidator( 1e-7, 1e+9, 0.1 );
+    DiameterSpinBox->SetValue( 1. );
+  }
+  /* Add to group ************************************************/
   GroupGroups = new QGroupBox( tr( "SMESH_ADD_TO_GROUP" ), this );
   GroupGroups->setCheckable( true );
   QHBoxLayout* GroupGroupsLayout = new QHBoxLayout(GroupGroups);
@@ -360,7 +379,7 @@ SMESHGUI_AddMeshElementDlg::SMESHGUI_AddMeshElementDlg( SMESHGUI*          theMo
   GroupGroupsLayout->addWidget( TextLabel_GroupName );
   GroupGroupsLayout->addWidget( ComboBox_GroupName, 1 );
 
-  /***************************************************************/
+  /* Apply etc ***************************************************/
   GroupButtons = new QGroupBox(this);
   QHBoxLayout* GroupButtonsLayout = new QHBoxLayout(GroupButtons);
   GroupButtonsLayout->setSpacing(SPACING);
@@ -415,27 +434,27 @@ void SMESHGUI_AddMeshElementDlg::Init()
 
   /* reset "Add to group" control */
   GroupGroups->setChecked( false );
-  GroupGroups->setVisible( myElementType != SMDSAbs_0DElement );
+  //GroupGroups->setVisible( myElementType != SMDSAbs_0DElement );
 
   myNbOkNodes = 0;
   myActor = 0;
 
   /* signals and slots connections */
-  connect(buttonOk, SIGNAL(clicked()),     SLOT(ClickOnOk()));
-  connect(buttonCancel, SIGNAL(clicked()), SLOT(ClickOnCancel()));
-  connect(buttonApply, SIGNAL(clicked()),  SLOT(ClickOnApply()));
-  connect(buttonHelp, SIGNAL(clicked()),   SLOT(ClickOnHelp()));
-
-  connect(SelectButtonC1A1, SIGNAL(clicked()), SLOT(SetEditCurrentArgument()));
-  connect(LineEditC1A1, SIGNAL(textChanged(const QString&)), SLOT(onTextChange(const QString&)));
-  connect(mySMESHGUI, SIGNAL (SignalDeactivateActiveDialog()), SLOT(DeactivateActiveDialog()));
-  connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), SLOT(SelectionIntoArgument()));
+  connect(buttonOk,        SIGNAL(clicked()),                     SLOT(ClickOnOk()));
+  connect(buttonCancel,    SIGNAL(clicked()),                     SLOT(reject()));
+  connect(buttonApply,     SIGNAL(clicked()),                     SLOT(ClickOnApply()));
+  connect(buttonHelp,      SIGNAL(clicked()),                     SLOT(ClickOnHelp()));
+
+  connect(SelectButtonC1A1,SIGNAL(clicked()),                     SLOT(SetEditCurrentArgument()));
+  connect(LineEditC1A1,    SIGNAL(textChanged(const QString&)),   SLOT(onTextChange(const QString&)));
+  connect(mySMESHGUI,      SIGNAL(SignalDeactivateActiveDialog()),SLOT(DeactivateActiveDialog()));
+  connect(mySelectionMgr,  SIGNAL(currentSelectionChanged()),     SLOT(SelectionIntoArgument()));
   /* to close dialog if study frame change */
-  connect(mySMESHGUI, SIGNAL (SignalStudyFrameChanged()), SLOT(ClickOnCancel()));
-  connect(mySMESHGUI, SIGNAL (SignalCloseAllDialogs()), SLOT(ClickOnCancel()));    
+  connect(mySMESHGUI,      SIGNAL(SignalStudyFrameChanged()),     SLOT(reject()));
+  connect(mySMESHGUI,      SIGNAL(SignalCloseAllDialogs()),       SLOT(reject()));    
 
   if (Reverse)
-    connect(Reverse, SIGNAL(stateChanged(int)), SLOT(CheckBox(int)));
+    connect(Reverse,       SIGNAL(stateChanged(int)),             SLOT(CheckBox(int)));
 
   // set selection mode
   SMESH::SetPointRepresentation(true);
@@ -459,9 +478,9 @@ void SMESHGUI_AddMeshElementDlg::ClickOnApply()
 
   if (myNbOkNodes && !mySMESHGUI->isActiveStudyLocked()) {
     myBusy = true;
-    SMESH::long_array_var anArrayOfIndices = new SMESH::long_array;
-    anArrayOfIndices->length(myNbNodes);
     QStringList aListId = myEditCurrentArgument->text().split(" ", QString::SkipEmptyParts);
+    SMESH::long_array_var anArrayOfIndices = new SMESH::long_array;
+    anArrayOfIndices->length(aListId.count());
     const std::vector<int>& revIndex = SMDS_MeshCell::reverseSmdsOrder( myGeomType );
     if ( Reverse && Reverse->isChecked() && !revIndex.empty() )
       for (int i = 0; i < aListId.count(); i++)
@@ -480,12 +499,12 @@ void SMESHGUI_AddMeshElementDlg::ClickOnApply()
     int idx = 0;
     if( addToGroup ) {
       aGroupName = ComboBox_GroupName->currentText();
-      for ( int i = 1; i < ComboBox_GroupName->count(); i++ ) {
+      for ( int i = 1; i <= ComboBox_GroupName->count(); i++ ) {
         QString aName = ComboBox_GroupName->itemText( i );
         if ( aGroupName == aName && ( i == ComboBox_GroupName->currentIndex() || idx == 0 ) )
           idx = i;
       }
-      if ( idx > 0 && idx < myGroups.count() ) {
+      if ( idx > 0 && idx <= myGroups.count() ) {
         SMESH::SMESH_GroupOnGeom_var aGeomGroup = SMESH::SMESH_GroupOnGeom::_narrow( myGroups[idx-1] );
         if ( !aGeomGroup->_is_nil() ) {
           int res = SUIT_MessageBox::question( this, tr( "SMESH_WRN_WARNING" ),
@@ -497,24 +516,38 @@ void SMESHGUI_AddMeshElementDlg::ClickOnApply()
       }
     }
 
-    long anElemId = -1;
     SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor();
+    SMESH::long_array_var anIdList = new SMESH::long_array;
+    anIdList->length( 1 );
+    anIdList[0] = -1;
+
     switch (myElementType) {
     case SMDSAbs_0DElement:
-      anElemId = aMeshEditor->Add0DElement(anArrayOfIndices[0]); break;
+      anIdList->length( anArrayOfIndices->length() );
+      for ( size_t i = 0; i < anArrayOfIndices->length(); ++i )
+        anIdList[i] = aMeshEditor->Add0DElement(anArrayOfIndices[i]);
+      break;
+    case SMDSAbs_Ball:
+      if ( myGeomType == SMDSEntity_Ball ) {
+        anIdList->length( anArrayOfIndices->length() );
+        for ( size_t i = 0; i < anArrayOfIndices->length(); ++i )
+          anIdList[i] = aMeshEditor->AddBall(anArrayOfIndices[i],
+                                             DiameterSpinBox->GetValue());
+      }
+      break;
     case SMDSAbs_Edge:
-      anElemId = aMeshEditor->AddEdge(anArrayOfIndices.inout()); break;
+      anIdList[0] = aMeshEditor->AddEdge(anArrayOfIndices.inout()); break;
     case SMDSAbs_Face:
       if ( myIsPoly )
-        anElemId = aMeshEditor->AddPolygonalFace(anArrayOfIndices.inout());
+        anIdList[0] = aMeshEditor->AddPolygonalFace(anArrayOfIndices.inout());
       else
-        anElemId = aMeshEditor->AddFace(anArrayOfIndices.inout());
+        anIdList[0] = aMeshEditor->AddFace(anArrayOfIndices.inout());
       break;
     default:
-      anElemId = aMeshEditor->AddVolume(anArrayOfIndices.inout()); break;
+      anIdList[0] = aMeshEditor->AddVolume(anArrayOfIndices.inout()); break;
     }
 
-    if ( anElemId != -1 && addToGroup && !aGroupName.isEmpty() ) {
+    if ( anIdList[0] > 0 && addToGroup && !aGroupName.isEmpty() ) {
       SMESH::SMESH_Group_var aGroupUsed;
       if ( aGroup->_is_nil() ) {
         // create new group 
@@ -537,12 +570,8 @@ void SMESHGUI_AddMeshElementDlg::ClickOnApply()
           aGroupUsed = SMESH::SMESH_Group::_narrow( aGroup );
       }
 
-      if ( !aGroupUsed->_is_nil() ) {
-        SMESH::long_array_var anIdList = new SMESH::long_array;
-        anIdList->length( 1 );
-        anIdList[0] = anElemId;
+      if ( !aGroupUsed->_is_nil() )
         aGroupUsed->Add( anIdList.inout() );
-      }
     }
 
     SALOME_ListIO aList; aList.Append( myActor->getIO() );
@@ -570,14 +599,14 @@ void SMESHGUI_AddMeshElementDlg::ClickOnApply()
 void SMESHGUI_AddMeshElementDlg::ClickOnOk()
 {
   ClickOnApply();
-  ClickOnCancel();
+  reject();
 }
 
 //=================================================================================
-// function : ClickOnCancel()
+// function : reject()
 // purpose  :
 //=================================================================================
-void SMESHGUI_AddMeshElementDlg::ClickOnCancel()
+void SMESHGUI_AddMeshElementDlg::reject()
 {
   //mySelectionMgr->clearSelected();
   mySimulation->SetVisibility(false);
@@ -586,7 +615,7 @@ void SMESHGUI_AddMeshElementDlg::ClickOnCancel()
     aViewWindow->SetSelectionMode( ActorSelection );
   disconnect(mySelectionMgr, 0, this, 0);
   mySMESHGUI->ResetState();
-  reject();
+  QDialog::reject();
 }
 
 //=================================================================================
@@ -654,7 +683,7 @@ void SMESHGUI_AddMeshElementDlg::onTextChange (const QString& theNewText)
     if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
       aViewWindow->highlight( myActor->getIO(), true, true );
 
-    myNbOkNodes = ( allOk && myNbNodes == aListId.count() );
+    myNbOkNodes = ( allOk && ( myNbNodes == aListId.count() || myNbNodes == 1 ));
 
     if (myIsPoly)
       {
@@ -744,7 +773,7 @@ void SMESHGUI_AddMeshElementDlg::SelectionIntoArgument()
   myBusy = false;
   if (myIsPoly && myElementType == SMDSAbs_Face && nbNodes >= 3 ) {
     myNbNodes = nbNodes;
-  } else if (myNbNodes != nbNodes) {
+  } else if (myNbNodes != nbNodes && myNbNodes != 1) {
     return;
   }
 
@@ -845,26 +874,6 @@ void SMESHGUI_AddMeshElementDlg::enterEvent (QEvent*)
   ActivateThisDialog();
 }
 
-//=================================================================================
-// function : closeEvent()
-// purpose  :
-//=================================================================================
-void SMESHGUI_AddMeshElementDlg::closeEvent (QCloseEvent*)
-{
-  /* same than click on cancel button */
-  ClickOnCancel();
-}
-
-//=================================================================================
-// function : hideEvent()
-// purpose  : caused by ESC key
-//=================================================================================
-void SMESHGUI_AddMeshElementDlg::hideEvent (QHideEvent*)
-{
-  if (!isMinimized())
-    ClickOnCancel();
-}
-
 //=================================================================================
 // function : CheckBox()
 // purpose  :