Salome HOME
Update of CheckDone
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_MeshOp.cxx
index 40fb8cb6c39e87804924df91a73e6b0e32b697bf..50132b41eee3cc0ea8f78e9816099d0e92af0036 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2019  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
 #include "SMESH_NumberFilter.hxx"
 #include "SMESH_TypeDefs.hxx"
 #include "SMESH_TypeFilter.hxx"
+#include "SMESH_Gen_i.hxx"
 
 #include CORBA_SERVER_HEADER(SMESH_BasicHypothesis)
 
 // SALOME GEOM includes
 #include <GEOMBase.h>
 #include <GEOMImpl_Types.hxx>
+#include <GEOM_Client.hxx>
 #include <GEOM_SelectionFilter.h>
 #include <GEOM_wrap.hxx>
 #include <GeometryGUI.h>
@@ -123,6 +125,57 @@ LightApp_Dialog* SMESHGUI_MeshOp::dlg() const
   return myDlg;
 }
 
+//================================================================================
+/*!
+ * \brief Log meshers info
+*/
+//================================================================================
+void SMESHGUI_MeshOp::logSmeshParams()
+{
+  QString mesherType;
+  int curMeshType = myDlg->currentMeshType();
+  switch ( curMeshType ) {
+  case MT_ANY:
+    mesherType = "Any";
+    break;
+  case MT_TRIANGULAR:
+    mesherType = "Triangular";
+    break;
+  case MT_QUADRILATERAL:
+    mesherType = "Quadrilateral";
+    break;
+  case MT_TETRAHEDRAL:
+    mesherType = "Tetrahedral";
+    break;
+  case MT_HEXAHEDRAL:
+    mesherType = "Hexahedral";
+    break;
+  default:
+    mesherType = "";
+  }
+
+  QString aMessage = QString("Mesh type is %1").arg(mesherType);
+  CAM_Application::logStructuredUserEvent( "Mesh",
+                                           "create mesh",
+                                           "",
+                                           "",
+                                           aMessage);
+
+  for ( int dim = 0; dim <= 3; ++dim )
+  {
+    HypothesisData * curAlgo = hypData( dim, Algo, currentHyp( dim, Algo ));
+    if(curAlgo)
+    {
+      aMessage = QString("%1D algorithm is %2").arg(dim).arg(curAlgo->Label);
+      CAM_Application::logStructuredUserEvent( "Mesh",
+                                           "create mesh",
+                                           "",
+                                           "",
+                                           aMessage);
+    }
+  }
+}
+
 //================================================================================
 /*!
  * \brief Creates or edits mesh
@@ -156,7 +209,7 @@ bool SMESHGUI_MeshOp::onApply()
     if (( myToCreate && !myIsMesh ) || myIsInvalidSubMesh )
       aResult = createSubMesh( aMess, anEntryList );
     else if ( !myToCreate )
-      aResult = editMeshOrSubMesh( aMess );
+      aResult = editMeshOrSubMesh( aMess, anEntryList );
     if ( aResult )
     {
       SMESHGUI::Modified();
@@ -180,6 +233,7 @@ bool SMESHGUI_MeshOp::onApply()
   {
     if ( myToCreate )
       setDefaultName();
+    //connect(aAction, SIGNAL(triggered(bool)), this, SLOT(logSmeshParams()));
   }
   else
   {
@@ -188,6 +242,7 @@ bool SMESHGUI_MeshOp::onApply()
     SUIT_MessageBox::warning( myDlg, tr( "SMESH_ERROR" ), aMess );
   }
 
+  logSmeshParams();
   myHypoSet = 0;
 
   return aResult;
@@ -321,7 +376,7 @@ SUIT_SelectionFilter* SMESHGUI_MeshOp::createFilter( const int theId ) const
 //================================================================================
 /*!
  * \brief check if selected shape is a sub-shape of the shape to mesh
 * \retval bool - check result
 \retval bool - check result
  */
 //================================================================================
 bool SMESHGUI_MeshOp::isSubshapeOk() const
@@ -345,61 +400,17 @@ bool SMESHGUI_MeshOp::isSubshapeOk() const
   QStringList aGEOMs;
   myDlg->selectedObject(SMESHGUI_MeshDlg::Geom, aGEOMs);
 
-  if (aGEOMs.count() > 0) {
-    GEOM::GEOM_Gen_var geomGen = SMESH::GetGEOMGen();
-    if (geomGen->_is_nil()) return false;
-
-    GEOM::GEOM_IGroupOperations_wrap op = geomGen->GetIGroupOperations();
-    if (op->_is_nil()) return false;
-
-    // check all selected shapes
-    QStringList::const_iterator aSubShapesIter = aGEOMs.begin();
-    for ( ; aSubShapesIter != aGEOMs.end(); aSubShapesIter++) {
-      QString aSubGeomEntry = (*aSubShapesIter);
-      _PTR(SObject) pSubGeom = SMESH::getStudy()->FindObjectID(aSubGeomEntry.toUtf8().data());
-      if (!pSubGeom) return false;
-
-      GEOM::GEOM_Object_var aSubGeomVar =
-        GEOM::GEOM_Object::_narrow(_CAST(SObject,pSubGeom)->GetObject());
-      if (aSubGeomVar->_is_nil()) return false;
-
-      // skl for NPAL14695 - implementation of searching of mainObj
-      GEOM::GEOM_Object_var mainObj = op->GetMainShape(aSubGeomVar); /* _var not _wrap as
-                                                                        mainObj already exists! */
-      while( !mainObj->_is_nil()) {
-        CORBA::String_var entry1 = mainObj->GetEntry();
-        CORBA::String_var entry2 = mainGeom->GetEntry();
-        if (std::string( entry1.in() ) == entry2.in() )
-          return true;
-        mainObj = op->GetMainShape(mainObj);
-      }
-      if ( aSubGeomVar->GetShapeType() == GEOM::COMPOUND )
-      {
-        // is aSubGeomVar a compound of sub-shapes?
-        GEOM::GEOM_IShapesOperations_wrap sop = geomGen->GetIShapesOperations();
-        if (sop->_is_nil()) return false;
-        GEOM::ListOfLong_var ids = sop->GetAllSubShapesIDs( aSubGeomVar,
-                                                            GEOM::SHAPE,/*sorted=*/false);
-        if ( ids->length() > 0 )
-        {
-          ids->length( 1 );
-          GEOM::GEOM_Object_var compSub = geomGen->AddSubShape( aSubGeomVar, ids );
-          if ( !compSub->_is_nil() )
-          {
-            GEOM::ListOfGO_var shared = sop->GetSharedShapes( mainGeom,
-                                                              compSub,
-                                                              compSub->GetShapeType() );
-            geomGen->RemoveObject( compSub );
-            compSub->UnRegister();
-            if ( shared->length() > 0 ) {
-              geomGen->RemoveObject( shared[0] );
-              shared[0]->UnRegister();
-            }
-            return ( shared->length() > 0 );
-          }
-        }
-      }
-    }
+  // check all selected shapes
+  for ( QString& aSubGeomEntry : aGEOMs )
+  {
+    _PTR(SObject) pSubGeom = SMESH::getStudy()->FindObjectID( aSubGeomEntry.toUtf8().data() );
+    if ( !pSubGeom ) return false;
+
+    GEOM::GEOM_Object_var subGeom =
+      GEOM::GEOM_Object::_narrow(_CAST(SObject,pSubGeom)->GetObject());
+
+    if ( SMESH::ContainsSubShape( mainGeom, subGeom, false ))
+      return true;
   }
 
   return false;
@@ -882,7 +893,7 @@ void SMESHGUI_MeshOp::availableHyps( const int       theDim,
                                      THypDataList&   theDataList,
                                      HypothesisData* thePrevAlgoData,
                                      HypothesisData* theNextAlgoData,
-                                     const QString&  theMeshType)
+                                     const QString&  /*theMeshType*/)
 {
   theDataList.clear();
   theHyps.clear();
@@ -1334,6 +1345,7 @@ void SMESHGUI_MeshOp::createHypothesis(const int      theDim,
       initHypCreator( aCreator );
 
       myDlg->setEnabled( false );
+      myDlg->hide();
       aCreator->create(initParamHyp, aHypName, myDlg, this, SLOT( onHypoCreated( int ) ) );
       dialog = true;
     }
@@ -1365,6 +1377,7 @@ void SMESHGUI_MeshOp::onHypoCreated( int result )
     int obj = myDlg->getActiveObject();
     onActivateObject( obj ); // Issue 0020170. Restore filters
     myDlg->setEnabled( true );
+    myDlg->show();
   }
 
   _PTR(SComponent) aFather = SMESH::getStudy()->FindComponent("SMESH");
@@ -1421,6 +1434,7 @@ void SMESHGUI_MeshOp::onEditHyp( const int theHypType, const int theIndex )
 
     removeCustomFilters(); // Issue 0020170
     myDlg->setEnabled( false );
+    myDlg->hide();
 
     aCreator->edit( aHyp.in(), aHypItem.second, dlg(), this, SLOT( onHypoEdited( int ) ) );
   }
@@ -1434,11 +1448,12 @@ void SMESHGUI_MeshOp::onEditHyp( const int theHypType, const int theIndex )
  *   1 = accepted
  */
 //================================================================================
-void SMESHGUI_MeshOp::onHypoEdited( int result )
+void SMESHGUI_MeshOp::onHypoEdited( int /*result*/ )
 {
   int obj = myDlg->getActiveObject();
   onActivateObject( obj ); // Issue 0020170. Restore filters
   myDlg->setEnabled( true );
+  myDlg->show();
 }
 
 //================================================================================
@@ -1756,7 +1771,7 @@ void SMESHGUI_MeshOp::createSubMeshOnInternalEdges( SMESH::SMESH_Mesh_ptr theMes
   for ( size_t i = 0; i < internalEdges.size(); ++i )
     intIDSet.insert( shapeIDs.FindIndex( internalEdges[ i ]));
 
-  GEOM::GEOM_Gen_var geomGen = SMESH::GetGEOMGen();
+  GEOM::GEOM_Gen_var geomGen = theMainShape->GetGen();
   if (geomGen->_is_nil()) return;
 
   GEOM::GEOM_Object_var edgeGroup;
@@ -1913,6 +1928,7 @@ void SMESHGUI_MeshOp::onHypoSet( const QString& theSetName )
   if ( aHypoSet->toUseCommonSize() && !getAverageSize( myAverageSize ))
     return;
 
+  int maxDim = -1;
   for ( int isAlgo = 1; isAlgo >= 0; --isAlgo )
     for ( aHypoSet->init( isAlgo, setType ); aHypoSet->more(); aHypoSet->next() )
     {
@@ -1930,6 +1946,7 @@ void SMESHGUI_MeshOp::onHypoSet( const QString& theSetName )
         {
           setCurrentHyp( myDim, Algo, index );
           onAlgoSelected( index, myDim );
+          maxDim = Max( maxDim, myDim );
         }
       }
       else
@@ -1963,6 +1980,9 @@ void SMESHGUI_MeshOp::onHypoSet( const QString& theSetName )
       }
     }
 
+  if ( maxDim > 0 )
+    myDlg->setCurrentTab( maxDim );
+
   return;
 }
 
@@ -2062,7 +2082,7 @@ bool SMESHGUI_MeshOp::createMesh( QString& theMess, QStringList& theEntryList )
     {
       // Create groups on all geom groups
 
-      GEOM::GEOM_Gen_var           geomGen = SMESH::GetGEOMGen();
+      GEOM::GEOM_Gen_var           geomGen = aGeomVar->GetGen();
       GEOM::GEOM_IShapesOperations_wrap op = geomGen->GetIShapesOperations();
       GEOM::ListOfGO_var        geomGroups = op->GetExistingSubObjects( aGeomVar,
                                                                         /*groupsOnly=*/false );
@@ -2076,7 +2096,10 @@ bool SMESHGUI_MeshOp::createMesh( QString& theMess, QStringList& theEntryList )
           elemType = SMESH::NODE;
 
         CORBA::String_var name = geomGroups[ iG ]->GetName();
-        meshGroup = aMesh->CreateGroupFromGEOM( elemType, name, geomGroups[ iG ]);
+
+        SALOMEDS::SObject_wrap groupSO = SMESH_Gen_i::GetSMESHGen()->ObjectToSObject( geomGroups[iG] );
+        if (!groupSO->_is_nil())
+          meshGroup = aMesh->CreateGroupFromGEOM( elemType, name, geomGroups[ iG ]);
         // if ( elemType != SMESH::NODE )
         //   meshGroup = aMesh->CreateGroupFromGEOM( SMESH::NODE, name, geomGroups[ iG ]);
       }
@@ -2138,11 +2161,11 @@ bool SMESHGUI_MeshOp::createSubMesh( QString& theMess, QStringList& theEntryList
   else if (aGEOMs.count() > 1)
   {
     // create a GEOM group
-    GEOM::GEOM_Gen_var geomGen = SMESH::GetGEOMGen();
-    if (!geomGen->_is_nil()) {
-      GEOM::GEOM_IGroupOperations_wrap op =
-        geomGen->GetIGroupOperations();
-      if (!op->_is_nil()) {
+    GEOM::GEOM_Gen_var geomGen = mainGeom->GetGen();
+    if ( !geomGen->_is_nil() ) {
+      GEOM::GEOM_IGroupOperations_wrap op = geomGen->GetIGroupOperations();
+      if ( !op->_is_nil() )
+      {
         // check and add all selected GEOM objects: they must be
         // a sub-shapes of the main GEOM and must be of one type
         int iSubSh = 0;
@@ -2611,13 +2634,14 @@ int SMESHGUI_MeshOp::find( const SMESH::SMESH_Hypothesis_var& theHyp,
 //================================================================================
 /*!
  * \brief Edits mesh or sub-mesh
-  * \param theMess - Output parameter intended for returning error message
-  * \retval bool  - TRUE if mesh is edited successfully, FALSE otherwise
+  * \param theMess      - Output parameter intended for returning error message
+ *  \param theEntryList - List of entries of published objects
+  * \retval bool        - TRUE if mesh is edited successfully, FALSE otherwise
  *
  * Assigns new name hypotheses and algorithms to the mesh or sub-mesh
  */
 //================================================================================
-bool SMESHGUI_MeshOp::editMeshOrSubMesh( QString& theMess )
+bool SMESHGUI_MeshOp::editMeshOrSubMesh( QString& theMess, QStringList& theEntryList)
 {
   theMess = "";
 
@@ -2662,6 +2686,12 @@ bool SMESHGUI_MeshOp::editMeshOrSubMesh( QString& theMess )
   if ( !isMesh && !aSubMeshVar->_is_nil() )
     aMesh = aSubMeshVar->GetFather();
 
+  _PTR(SObject) aMeshSO = SMESH::FindSObject(aMesh.in());
+  if (aMeshSO) {
+    if (aSubMeshVar->_is_nil()) SMESH::SetName(aMeshSO, myDlg->objectText(SMESHGUI_MeshDlg::Obj));
+    theEntryList.append(aMeshSO->GetID().c_str());
+  }
+
   // Assign new algorithms and hypotheses
   for ( int dim = aDim; dim <= SMESH::DIM_3D; dim++ )
   {
@@ -2970,7 +3000,7 @@ void SMESHGUI_MeshOp::updateHypoSets()
  * \param theIndex - Index of current type of mesh
  */
 //================================================================================
-void SMESHGUI_MeshOp::onAlgoSetByMeshType( const int theTabIndex, const int theIndex )
+void SMESHGUI_MeshOp::onAlgoSetByMeshType( const int /*theTabIndex*/, const int /*theIndex*/ )
 {
   setFilteredAlgoData();
 }