Salome HOME
0022364: EDF SMESH: Create Mesh dialog box improvement: hide inapplicable algorithms...
authorimn <imn@opencascade.com>
Fri, 28 Feb 2014 14:58:28 +0000 (18:58 +0400)
committerimn <imn@opencascade.com>
Fri, 28 Feb 2014 14:58:28 +0000 (18:58 +0400)
0022365: EDF SMESH: Create Mesh dialog box improvement: hide algorithms depending on a mesh type

src/SMESHGUI/SMESHGUI_MeshDlg.cxx
src/SMESHGUI/SMESHGUI_MeshDlg.h
src/SMESHGUI/SMESHGUI_MeshOp.cxx
src/SMESH_SWIG/smeshBuilder.py
src/SMESH_SWIG/smesh_algorithm.py
src/StdMeshers/StdMeshers_Hexa_3D.cxx
src/StdMeshers/StdMeshers_RadialPrism_3D.cxx

index 30b8dfe..6826732 100644 (file)
@@ -668,5 +668,12 @@ int SMESHGUI_MeshDlg::currentMeshType( )
 {
   return myMeshType->currentIndex( );
 }
-
-
+//================================================================================
+/*!
+ * \brief Set current index types of mesh
+ */
+//================================================================================
+void SMESHGUI_MeshDlg::setCurrentMeshType( const int theIndex )
+{
+  myMeshType->setCurrentIndex( theIndex );
+}
index fb3604f..2d0cdde 100644 (file)
@@ -76,6 +76,7 @@ public:
   int                          getActiveObject();
   void                         setAvailableMeshType(const QStringList& );
   int                          currentMeshType();
+  void                         setCurrentMeshType( const int );
 
 signals:
   void                         hypoSet( const QString& );
index 6506d1e..6260810 100644 (file)
@@ -688,10 +688,13 @@ void SMESHGUI_MeshOp::selectionDone()
       myDlg->adjustSize();
       readMesh();
     }
+    int curIndex = myDlg->currentMeshType( );
     QStringList TypeMeshList;
     createMeshTypeList( TypeMeshList );
     setAvailableMeshType( TypeMeshList );
-    setFilteredAlgoData( myMaxShapeDim, myDlg->currentMeshType( ));
+    curIndex =( curIndex >= TypeMeshList.count() ) ? 0 : curIndex;
+    myDlg->setCurrentMeshType( curIndex );
+    setFilteredAlgoData( myMaxShapeDim, curIndex);
   }
   catch ( const SALOME::SALOME_Exception& S_ex )
   {
@@ -1421,7 +1424,7 @@ void SMESHGUI_MeshOp::onAlgoSelected( const int theIndex,
   // check that algorithms of other dimentions are compatible with
   // the selected one
   if ( !algoData ) { // all algos becomes available
-    if (myDlg->currentMeshType() == MT_ANY)
+    if (myDlg->currentMeshType() == MT_ANY || aDim == SMESH::DIM_1D || aDim == SMESH::DIM_0D)
       availableHyps( aDim, Algo, anAvailable, myAvailableHypData[ aDim ][ Algo ]);
     else{
       anAvailable.clear();
index 966b5fd..98b1921 100644 (file)
@@ -1563,15 +1563,23 @@ class Mesh:
             if not geom:
                 geom = self.mesh.GetShapeToMesh()
             pass
-        AssureGeomPublished( self, geom, "shape for %s" % hyp.GetName())
-        status = self.mesh.AddHypothesis(geom, hyp)
-        isAlgo = hyp._narrow( SMESH_Algo )
-        hyp_name = GetName( hyp )
+        hyp_name = hyp.GetName()
+        lib_name = hyp.GetLibName()
         geom_name = ""
         if geom:
-            geom_name = GetName( geom )
-        TreatHypoStatus( status, hyp_name, geom_name, isAlgo )
-        return status
+            geom_name = geom.GetName()
+        isApplicable = True
+        isAlgo = hyp._narrow( SMESH_Algo )
+        if self.mesh.HasShapeToMesh():
+            isApplicable = self.smeshpyD.IsApplicable(hyp_name, lib_name, geom, not geom.IsSame( self.mesh.GetShapeToMesh() ) )
+        if isApplicable:
+            AssureGeomPublished( self, geom, "shape for %s" % hyp.GetName())
+            status = self.mesh.AddHypothesis(geom, hyp)
+            TreatHypoStatus( status, hyp_name, geom_name, isAlgo )
+            return status
+        else:
+            TreatHypoStatus( HYP_BAD_GEOMETRY, hyp_name, geom_name, isAlgo )
+            return HYP_BAD_GEOMETRY
 
     ## Return True if an algorithm of hypothesis is assigned to a given shape
     #  @param hyp a hypothesis to check
index 546b71d..95ac572 100644 (file)
@@ -208,8 +208,7 @@ class Mesh_Algorithm:
                 pass
             self.subm = mesh.mesh.GetSubMesh(geom, algo.GetName())
         self.algo = algo
-        status = mesh.mesh.AddHypothesis(self.geom, self.algo)
-        TreatHypoStatus( status, algo.GetName(), name, True )
+        status = mesh.AddHypothesis(self.geom, self.algo)
         return
 
     def CompareHyp (self, hyp, args):
index fd67131..2ac7caf 100644 (file)
@@ -760,18 +760,20 @@ bool StdMeshers_Hexa_3D::IsApplicable( const TopoDS_Shape & aShape, bool toCheck
   if ( !exp0.More() ) return false;
   for ( ; exp0.More(); exp0.Next() )
   {
-    nbFoundShells = 1;
+    nbFoundShells = 0;
     isCurShellApp = false;
-    for (TopExp_Explorer exp1( exp0.Current(), TopAbs_SHELL ); exp1.More(); exp1.Next(), ++nbFoundShells){
-      if ( nbFoundShells == 2 ) {
-        if ( toCheckAll ) return false;
-        break;
-      }
-      const TopoDS_Shell& shell = TopoDS::Shell(exp1.Current());
-      isCurShellApp = SMESH_Block::FindBlockShapes(shell, theVertex0, theVertex1, theShapeIDMap );
-      if ( toCheckAll && !isCurShellApp ) return false;
-    }
-    if( !toCheckAll && isCurShellApp ) return true;
+    TopExp_Explorer exp1( exp0.Current(), TopAbs_SHELL );
+    for ( ; exp1.More(); exp1.Next(), ++nbFoundShells)
+      if ( nbFoundShells == 2 ) break;
+    if ( nbFoundShells == 2){
+      if ( toCheckAll ) return false;
+      continue;
+    }   
+    exp1.Init( exp0.Current(), TopAbs_SHELL );
+    const TopoDS_Shell& shell = TopoDS::Shell(exp1.Current());
+    isCurShellApp = SMESH_Block::FindBlockShapes(shell, theVertex0, theVertex1, theShapeIDMap );
+    if ( toCheckAll && !isCurShellApp ) return false;
+    if ( !toCheckAll && isCurShellApp ) return true;
   }
   return toCheckAll;
 };
index f6d39bd..ab9594c 100644 (file)
@@ -625,7 +625,10 @@ bool StdMeshers_RadialPrism_3D::IsApplicable( const TopoDS_Shape & aShape, bool
       }
       shell[ nbShells-1 ] = It.Value();
     }
-    if ( nbShells != 2 ) continue;
+    if ( nbShells != 2 ) { 
+      if ( toCheckAll ) return false;  
+      continue; 
+    }
 
     int nbFaces1 = SMESH_MesherHelper:: Count( shell[0], TopAbs_FACE, 0 );
     int nbFaces2 = SMESH_MesherHelper:: Count( shell[1], TopAbs_FACE, 0 );