Salome HOME
[bos #40653][CEA] New mesh import export formats with meshio.
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_FilterLibraryDlg.cxx
index c17dde1fa69a7b6b4bbfa2563b0651d8af7a95fe..d22cbd373bf6958ecce6927c390d4086fc6ce2ac 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2024  CEA, EDF, OPEN CASCADE
 //
 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -6,7 +6,7 @@
 // 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.
+// version 2.1 of the License, or (at your option) any later version.
 //
 // This library is distributed in the hope that it will be useful,
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -30,6 +30,9 @@
 #include "SMESHGUI.h"
 #include "SMESHGUI_FilterUtils.h"
 #include "SMESHGUI_FilterDlg.h"
+#include "SMESHGUI_VTKUtils.h"
+
+#include <GEOMBase.h>
 
 // SALOME GUI includes
 #include <SUIT_Session.h>
@@ -37,8 +40,9 @@
 #include <SUIT_FileDlg.h>
 #include <SUIT_MessageBox.h>
 #include <SUIT_ResourceMgr.h>
-
 #include <LightApp_Application.h>
+#include <LightApp_SelectionMgr.h>
+#include <SALOME_ListIO.hxx>
 
 // Qt includes
 #include <QApplication>
@@ -149,7 +153,7 @@ void SMESHGUI_FilterLibraryDlg::construct (const QList<int>& theTypes,
 
   aDlgLay->setStretchFactor(myMainFrame, 1);
 
-  myHelpFileName = "selection_filter_library_page.html";
+  myHelpFileName = "selection_filter_library.html";
   
   Init(myTypes, myMode);
 }
@@ -207,7 +211,7 @@ QWidget* SMESHGUI_FilterLibraryDlg::createMainFrame (QWidget* theParent)
   myTable->SetLibsEnabled(false);
 
   myListBox->setMinimumHeight((int)(myTable->sizeHint().height() * 0.5));
-  //myListBox->setRowMode(QListWidget::FitToWidth); //VSR : TODO ???
+  //myListBox->setRowMode(QListWidget::FitToWidth);
   myListBox->setSelectionMode(QListWidget::SingleSelection);
 
   myOpenBtn->setAutoDefault(false);
@@ -233,13 +237,16 @@ QWidget* SMESHGUI_FilterLibraryDlg::createMainFrame (QWidget* theParent)
   connect(myDeleteBtn, SIGNAL(clicked()), this, SLOT(onDeleteBtnPressed()));
 
   connect(myName, SIGNAL(textChanged(const QString&)),
-           this, SLOT(onFilterNameChanged(const QString&)));
+          this, SLOT(onFilterNameChanged(const QString&)));
 
   connect(myTable, SIGNAL(EntityTypeChanged(const int)),
-           this, SLOT(onEntityTypeChanged(const int)));
+          this, SLOT(onEntityTypeChanged(const int)));
 
   connect(myTable, SIGNAL(NeedValidation()), this, SLOT(onNeedValidation()));
 
+  LightApp_SelectionMgr* selMgr = SMESH::GetSelectionMgr( mySMESHGUI );
+  connect( selMgr, SIGNAL(currentSelectionChanged()), SLOT(onSelectionDone()));
+
   return aMainFrame;
 }
 
@@ -269,7 +276,7 @@ QWidget* SMESHGUI_FilterLibraryDlg::createButtonFrame (QWidget* theParent)
   aLay->addWidget(myButtons[ BTN_Help   ]);
 
   connect(myButtons[ BTN_OK     ], SIGNAL(clicked()), SLOT(onOk()));
-  connect(myButtons[ BTN_Close  ], SIGNAL(clicked()), SLOT(onClose()));
+  connect(myButtons[ BTN_Close  ], SIGNAL(clicked()), SLOT(reject()));
   connect(myButtons[ BTN_Apply  ], SIGNAL(clicked()), SLOT(onApply()));
   connect(myButtons[ BTN_Help   ], SIGNAL(clicked()), SLOT(onHelp()));
 
@@ -337,7 +344,7 @@ void SMESHGUI_FilterLibraryDlg::Init (const QList<int>& theTypes,
   setEnabled(true);
 
   connect( mySMESHGUI, SIGNAL(SignalDeactivateActiveDialog()), SLOT(onDeactivate()));
-  connect( mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), SLOT(onClose()));
+  connect( mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), SLOT(reject()));
 
   if (myMode == ADD_TO)
   {
@@ -423,7 +430,7 @@ bool SMESHGUI_FilterLibraryDlg::onApply()
   }
 
   if (myFileName->text() != myLibrary->GetFileName())
-    myLibrary->SetFileName( myFileName->text().toLatin1().constData() );
+    myLibrary->SetFileName( myFileName->text().toUtf8().constData() );
 
   bool aResult = false;
 
@@ -432,8 +439,8 @@ bool SMESHGUI_FilterLibraryDlg::onApply()
   } else if (myMode == EDIT || myMode == ADD_TO) {
     SMESH::Filter_var aFilter = createFilter();
     if (!myListBox->selectedItems().empty() && 
-        !myLibrary->Replace(myCurrFilterName.toLatin1().constData(),
-                            myName->text().toLatin1().constData(),
+        !myLibrary->Replace(myCurrFilterName.toUtf8().constData(),
+                            myName->text().toUtf8().constData(),
                             aFilter.in())) {
       SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_ERROR"),
                                    tr("ERROR_OF_EDITING"));
@@ -466,8 +473,7 @@ bool SMESHGUI_FilterLibraryDlg::onApply()
 //=======================================================================
 void SMESHGUI_FilterLibraryDlg::onOk()
 {
-  if (onApply())
-  {
+  if (onApply()) {
     disconnect( mySMESHGUI, 0, this, 0);
     mySMESHGUI->ResetState();
     accept();
@@ -475,14 +481,14 @@ void SMESHGUI_FilterLibraryDlg::onOk()
 }
 
 //=======================================================================
-// name    : SMESHGUI_FilterLibraryDlg::onClose
+// name    : SMESHGUI_FilterLibraryDlg::reject
 // Purpose : SLOT called when "Close" button pressed. Close dialog
 //=======================================================================
-void SMESHGUI_FilterLibraryDlg::onClose()
+void SMESHGUI_FilterLibraryDlg::reject()
 {
   disconnect( mySMESHGUI, 0, this, 0);
   mySMESHGUI->ResetState();
-  reject();
+  QDialog::reject();
 }
 
 //=================================================================================
@@ -511,7 +517,7 @@ void SMESHGUI_FilterLibraryDlg::onHelp()
 
 //=======================================================================
 // name    : SMESHGUI_FilterLibraryDlg::onDeactivate
-// Purpose : SLOT called when dialog must be deativated
+// Purpose : SLOT called when dialog must be deactivated
 //=======================================================================
 void SMESHGUI_FilterLibraryDlg::onDeactivate()
 {
@@ -527,15 +533,6 @@ void SMESHGUI_FilterLibraryDlg::enterEvent(QEvent*)
   setEnabled(true);
 }
 
-//=================================================================================
-// function : closeEvent()
-// purpose  : Close dialog
-//=================================================================================
-void SMESHGUI_FilterLibraryDlg::closeEvent(QCloseEvent* e)
-{
-  onClose();
-}
-
 //=======================================================================
 // name    : SMESHGUI_FilterLibraryDlg::getFileName
 // Purpose : Get file name
@@ -605,7 +602,7 @@ QStringList SMESHGUI_FilterLibraryDlg::prepareFilters() const
 
 //================================================================
 // Function : onBrowse
-// Purpose  : SLOT. Display "Open file" dialog for chosing library name
+// Purpose  : SLOT. Display "Open file" dialog for choosing library name
 //================================================================
 void SMESHGUI_FilterLibraryDlg::onBrowse()
 {
@@ -614,7 +611,7 @@ void SMESHGUI_FilterLibraryDlg::onBrowse()
 
   //aDlg->setMode(myMode == COPY_FROM ? QFileDialogP::ExistingFile : QFileDialogP::AnyFile);
   aDlg->setFileMode(myMode == COPY_FROM ? QFileDialog::ExistingFile : QFileDialog::AnyFile);
-  aDlg->setFilters(prepareFilters());
+  aDlg->setNameFilters(prepareFilters());
   aDlg->selectFile(getFileName());
 
   QPushButton* anOkBtn = (QPushButton*)aDlg->findChild<QPushButton*>("OK");
@@ -632,8 +629,8 @@ void SMESHGUI_FilterLibraryDlg::onBrowse()
   if (QFileInfo(fName).suffix().isEmpty())
     fName = autoExtension(fName);
 
-  fName = QDir::convertSeparators(fName);
-  QString prev = QDir::convertSeparators(getFileName());
+  fName = QDir::toNativeSeparators(fName);
+  QString prev = QDir::toNativeSeparators(getFileName());
 
   if (prev == fName)
     return;
@@ -665,7 +662,7 @@ void SMESHGUI_FilterLibraryDlg::processNewLibrary()
   if (aFilterMgr->_is_nil())
     return;
 
-  myLibrary = aFilterMgr->LoadLibrary(autoExtension(getFileName()).toLatin1().constData());
+  myLibrary = aFilterMgr->LoadLibrary(autoExtension(getFileName()).toUtf8().constData());
   if (myLibrary->_is_nil()) {
     if (myMode == COPY_FROM) {
       SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_ERROR"),
@@ -673,7 +670,7 @@ void SMESHGUI_FilterLibraryDlg::processNewLibrary()
       return;
     } else {
       myLibrary = aFilterMgr->CreateLibrary();
-      myLibrary->SetFileName(getFileName().toLatin1().constData());
+      myLibrary->SetFileName(getFileName().toUtf8().constData());
     }
   }
 
@@ -759,7 +756,7 @@ bool SMESHGUI_FilterLibraryDlg::isPermissionValid(const bool theIsExistingOnly)
   if (QFileInfo(fName).suffix().isEmpty())
     fName = autoExtension(fName);
 
-  fName = QDir::convertSeparators(fName);
+  fName = QDir::toNativeSeparators(fName);
 
   if (QFileInfo(fName).exists()) {
     isWritable = QFileInfo(fName).isWritable();
@@ -825,14 +822,14 @@ void SMESHGUI_FilterLibraryDlg::onFilterChanged()
     }
 
     SMESH::Filter_var aFilter = createFilter();
-    myLibrary->Replace(myCurrFilterName.toLatin1().constData(), 
-                       myName->text().toLatin1().constData(), 
+    myLibrary->Replace(myCurrFilterName.toUtf8().constData(), 
+                       myName->text().toUtf8().constData(), 
                        aFilter);
   }
 
   // Fill table with filter parameters
 
-  SMESH::Filter_var aFilter = myLibrary->Copy(theName.toLatin1().constData());
+  SMESH::Filter_var aFilter = myLibrary->Copy(theName.toUtf8().constData());
   myCurrFilterName = theName;
   myCurrFilter = myListBox->currentRow();
   myName->setText(theName);
@@ -895,7 +892,7 @@ void SMESHGUI_FilterLibraryDlg::enableMainButtons()
 
 //=======================================================================
 // name    : SMESHGUI_FilterLibraryDlg::createFilter
-// Purpose : Cerate filter in accordance with library
+// Purpose : Create filter in accordance with library
 //=======================================================================
 SMESH::Filter_ptr SMESHGUI_FilterLibraryDlg::createFilter(const int theType)
 {
@@ -932,8 +929,8 @@ void SMESHGUI_FilterLibraryDlg::onAddBtnPressed()
       return;
 
     SMESH::Filter_var aFilter = createFilter();
-    myLibrary->Replace(myCurrFilterName.toLatin1().constData(), 
-                       myName->text().toLatin1().constData(), 
+    myLibrary->Replace(myCurrFilterName.toUtf8().constData(), 
+                       myName->text().toUtf8().constData(), 
                        aFilter);
   }
   myTable->Clear(myTable->GetType());
@@ -969,8 +966,8 @@ void SMESHGUI_FilterLibraryDlg::addFilterToLib (const QString& theName)
 
   // add new filter in library
   bool aResult = !aFilter->GetPredicate()->_is_nil()
-    ? myLibrary->Add(aName.toLatin1().constData(), aFilter)
-    : myLibrary->AddEmpty(aName.toLatin1().constData(), (SMESH::ElementType)myTable->GetType());
+    ? myLibrary->Add(aName.toUtf8().constData(), aFilter)
+    : myLibrary->AddEmpty(aName.toUtf8().constData(), (SMESH::ElementType)myTable->GetType());
 
   if (!aResult) {
     SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_ERROR"),
@@ -1090,7 +1087,7 @@ void SMESHGUI_FilterLibraryDlg::onDeleteBtnPressed()
 
   int anIndex = getIndex(myCurrFilterName);
 
-  if (anIndex == -1 || !myLibrary->Delete(myCurrFilterName.toLatin1().constData())) {
+  if (anIndex == -1 || !myLibrary->Delete(myCurrFilterName.toUtf8().constData())) {
     SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_ERROR"),
                                  tr("ERROR_OF_DELETING"));
   } else {
@@ -1155,7 +1152,7 @@ const SMESHGUI_FilterTable* SMESHGUI_FilterLibraryDlg::GetTable() const
 // name    : SMESHGUI_FilterLibraryDlg::onEntityTypeChanged
 // Purpose : SLOT. Called when entiyt type changed
 //=======================================================================
-void SMESHGUI_FilterLibraryDlg::onEntityTypeChanged(const int theType)
+void SMESHGUI_FilterLibraryDlg::onEntityTypeChanged(const int /*theType*/)
 {
   if (myLibrary->_is_nil())
     return;
@@ -1182,13 +1179,85 @@ void SMESHGUI_FilterLibraryDlg::onNeedValidation()
     if (valid)
     {
       SMESH::Filter_var aFilter = createFilter(myTable->GetType());
-      myLibrary->Replace(myCurrFilterName.toLatin1().constData(),
-                         myName->text().toLatin1().constData(),
+      myLibrary->Replace(myCurrFilterName.toUtf8().constData(),
+                         myName->text().toUtf8().constData(),
                          aFilter);
     }
   }
 }
 
+
+//=======================================================================
+// name    : SMESHGUI_FilterLibraryDlg::onSelectionDone
+// Purpose : SLOT called when selection changed.
+//           If current cell corresponds to the threshold value of
+//           BelongToGeom criterion name of selected object is set in this cell
+//=======================================================================
+
+void SMESHGUI_FilterLibraryDlg::onSelectionDone()
+{
+  SALOME_ListIO aList;
+  if( LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr() )
+    aSel->selectedObjects( aList );
+
+  int aRow, aCol;
+  if (aList.Extent() != 1 || !myTable->CurrentCell(aRow, aCol))
+    return;
+
+  const int type = myTable->GetCriterionType(aRow);
+  QList<int> types;
+  types << SMESH::FT_BelongToGeom      << SMESH::FT_BelongToPlane 
+        << SMESH::FT_BelongToCylinder  << SMESH::FT_BelongToGenSurface
+        << SMESH::FT_LyingOnGeom       << SMESH::FT_CoplanarFaces
+        << SMESH::FT_ConnectedElements << SMESH::FT_BelongToMeshGroup;
+  if ( !types.contains( type ))
+    return;
+
+  Handle(SALOME_InteractiveObject) anIO = aList.First();
+  switch ( type )
+  {
+  case SMESH::FT_CoplanarFaces: // get ID of a selected mesh face
+    {
+      QString aString;
+      int nbElems = SMESH::GetNameOfSelectedElements(SMESH::GetSelector(), anIO, aString);
+      if (nbElems == 1)
+        myTable->SetThreshold(aRow, aString);
+      break;
+    }
+  case SMESH::FT_ConnectedElements: // get either VERTEX or a node ID
+    {
+      GEOM::GEOM_Object_var anObj = SMESH::IObjectToInterface<GEOM::GEOM_Object>(anIO);
+      if (!anObj->_is_nil())
+      {
+        myTable->SetThreshold(aRow, GEOMBase::GetName(anObj));
+        myTable->SetID       (aRow, anIO->getEntry());
+      }
+      else
+      {
+        QString aString;
+        int nbElems = SMESH::GetNameOfSelectedElements(SMESH::GetSelector(), anIO, aString);
+        if (nbElems == 1)
+          myTable->SetThreshold(aRow, aString);
+      }
+      break;
+    }
+  case SMESH::FT_BelongToMeshGroup: // get a group name and IOR
+    {
+      myTable->SetThreshold(aRow, anIO->getName() );
+      break;
+    }
+  default: // get a GEOM object
+    {
+      GEOM::GEOM_Object_var anObj = SMESH::IObjectToInterface<GEOM::GEOM_Object>(anIO);
+      if (!anObj->_is_nil())
+      {
+        myTable->SetThreshold(aRow, GEOMBase::GetName(anObj));
+        myTable->SetID       (aRow, anIO->getEntry());
+      }
+    }
+  }
+}
+
 //=================================================================================
 // function : keyPressEvent()
 // purpose  :