Salome HOME
IMP 23373: [CEA 1170] Optimization of a 3D mesh using MG-Tetra
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_MeshOp.cxx
index 33472f9376b1a90d751693c1ae75e9ec3431236a..52920773b97b13cffbbbc363a74c6fc4775f4fe5 100644 (file)
@@ -200,6 +200,8 @@ bool SMESHGUI_MeshOp::onApply()
 //================================================================================
 void SMESHGUI_MeshOp::startOperation()
 {
+  myIgnoreAlgoSelection = false;
+
   if (!myDlg)
   {
     myDlg = new SMESHGUI_MeshDlg( myToCreate, myIsMesh );
@@ -260,7 +262,6 @@ void SMESHGUI_MeshOp::startOperation()
   myDlg->setGeomPopupEnabled(false);
   selectionDone();
 
-  myIgnoreAlgoSelection = false;
   myHasConcurrentSubBefore = false;
 
   myObjectToSelect.clear();
@@ -637,13 +638,14 @@ void SMESHGUI_MeshOp::selectionDone()
         {
           SMESH::SMESH_subMesh_var submeshVar =
             SMESH::SMESH_subMesh::_narrow( _CAST( SObject,pObj )->GetObject() );
+          myIsMesh = submeshVar->_is_nil();
+          myDlg->setTitile( myToCreate, myIsMesh );
           myDlg->setObjectShown( SMESHGUI_MeshDlg::Mesh, !submeshVar->_is_nil() );
           myDlg->setObjectShown( SMESHGUI_MeshDlg::Geom, true );
           myDlg->objectWg( SMESHGUI_MeshDlg::Mesh, SMESHGUI_MeshDlg::Btn )->hide();
           myDlg->objectWg( SMESHGUI_MeshDlg::Geom, SMESHGUI_MeshDlg::Btn )->hide();
           myDlg->updateGeometry();
           myDlg->adjustSize();
-          myIsMesh = submeshVar->_is_nil();
           readMesh();
         }
         else
@@ -941,7 +943,6 @@ void SMESHGUI_MeshOp::availableHyps( const int       theDim,
   bool isAux  = ( theHypType >= AddHyp );
   QStringList aHypTypeNameList = SMESH::GetAvailableHypotheses( isAlgo, theDim, isAux, myIsOnGeometry, !myIsMesh );
 
-  QStringList::const_iterator anIter;
   GEOM::GEOM_Object_var aGeomVar;
   QString aCurrentGeomToSelect;
   if ( !theMeshType.isEmpty() ) {
@@ -953,23 +954,50 @@ void SMESHGUI_MeshOp::availableHyps( const int       theDim,
      myHypMapIsApplicable.clear();
   }
 
+  std::multimap< double, HypothesisData* > sortedHyps;
+  QStringList::const_iterator anIter;
   for ( anIter = aHypTypeNameList.begin(); anIter != aHypTypeNameList.end(); ++anIter )
   {
     HypothesisData* aData = SMESH::GetHypothesisData( *anIter );
     if ( ( isCompatible ( thePrevAlgoData, aData, theHypType ) &&
            isCompatible ( theNextAlgoData, aData, theHypType ) ) ||
-           ( theMeshType == "ANY" && aData->InputTypes.isEmpty())) {
-      if ( !theMeshType.isEmpty() && theDim >= SMESH::DIM_2D &&
+           ( theMeshType == "ANY" && aData->InputTypes.isEmpty()))
+    {
+      if ( ( !theMeshType.isEmpty() )  &&
+           ( theDim >= SMESH::DIM_2D ) &&
            ( ( theMeshType != "ANY" && !isCompatibleToMeshType( aData, theMeshType )) ||
-           !isCompatibleToGeometry( aData, aCurrentGeomToSelect, aGeomVar )))
+             !isCompatibleToGeometry( aData, aCurrentGeomToSelect, aGeomVar )))
         continue;
+
+      int  groupID = aData->GroupID;
+      int priority = aData->Priority;
+      if ( groupID  < 0 || groupID > 9    ) groupID  = 9;
+      if ( priority < 0 || priority > 999 ) priority = 999;
+
+      sortedHyps.insert( std::make_pair( groupID + priority * 1e-3, aData ));
+    }
+  }
+
+  if ( !sortedHyps.empty() )
+  {
+    HypothesisData* aPrevGroup = SMESH::GetGroupTitle( sortedHyps.rbegin()->second, isAlgo );
+    std::multimap< double, HypothesisData* >::iterator key_hyp = sortedHyps.begin();
+    for ( ; key_hyp != sortedHyps.end(); ++key_hyp )
+    {
+      HypothesisData*  aData = key_hyp->second;
+      HypothesisData* aGroup = SMESH::GetGroupTitle( aData, isAlgo );
+      if ( aPrevGroup != aGroup )
+      {
+        theDataList.append( aGroup );
+        theHyps.append( aGroup->Label );
+        aPrevGroup = aGroup;
+      }
       theDataList.append( aData );
       theHyps.append( aData->Label );
     }
   }
 
-  if ( !theMeshType.isEmpty() && !aCurrentGeomToSelect.isEmpty() &&
-       myLastGeomToSelect != aCurrentGeomToSelect )
+  if ( !theMeshType.isEmpty() && !aCurrentGeomToSelect.isEmpty() )
     myLastGeomToSelect = aCurrentGeomToSelect;
 }
 
@@ -1164,12 +1192,9 @@ void SMESHGUI_MeshOp::initHypCreator( SMESHGUI_GenericHypothesisCreator* theCrea
   // Set shapes, of mesh and sub-mesh if any
 
   // get Entry of the Geom object
-  QString aGeomEntry = "";
-  QString aMeshEntry = "";
-  QString anObjEntry = "";
-  aGeomEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Geom );
-  aMeshEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Mesh );
-  anObjEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Obj );
+  QString aGeomEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Geom );
+  QString aMeshEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Mesh );
+  QString anObjEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Obj ); 
 
   if ( myToCreate && myIsMesh )
     aMeshEntry = aGeomEntry;
@@ -1214,6 +1239,8 @@ void SMESHGUI_MeshOp::initHypCreator( SMESHGUI_GenericHypothesisCreator* theCrea
   theCreator->setShapeEntry( aGeomEntry );
   if ( aMeshEntry != "" )
     theCreator->setMainShapeEntry( aMeshEntry );
+
+  theCreator->setNoGeomMesh( !myIsOnGeometry && myIsMesh && !myToCreate );
 }
 
 //================================================================================
@@ -1340,7 +1367,8 @@ void SMESHGUI_MeshOp::createHypothesis(const int theDim,
       aCreator->create(initParamHyp, aHypName, myDlg, this, SLOT( onHypoCreated( int ) ) );
       dialog = true;
     }
-    else {
+    else
+    {
      SMESH::SMESH_Hypothesis_var aHyp =
        SMESH::CreateHypothesis(theTypeName, aHypName, false);
      aHyp.out();
@@ -2172,6 +2200,7 @@ SMESH::SMESH_Hypothesis_var SMESHGUI_MeshOp::getAlgo( const int theDim )
             SMESH::CreateHypothesis(aHypName, aHypName, true);
           aHyp.out();
         }
+        delete aCreator;
       }
       QStringList tmpList;
       _PTR(SComponent) aFather = SMESH::GetActiveStudyDocument()->FindComponent( "SMESH" );
@@ -2726,7 +2755,7 @@ void SMESHGUI_MeshOp::setFilteredAlgoData( const int theTabIndex, const int theI
   }
   else
   {
-    HypothesisData* anCurrentAlgo;
+    HypothesisData* anCurrentAlgo = 0;
     bool isReqDisBound = true;
     QString anCurrentCompareType = anCompareType;
     isNone = currentHyp( aDim, Algo ) < 0;