Salome HOME
53057: NETGEN-1D2D3D issues "Ignored" warning for faces of a sub-mesh
authoreap <eap@opencascade.com>
Tue, 15 Mar 2016 12:59:11 +0000 (15:59 +0300)
committereap <eap@opencascade.com>
Tue, 15 Mar 2016 12:59:11 +0000 (15:59 +0300)
This case also reveals the following bugs:

1) SMESH_MesherHelper::IsReversedSubMesh() incorrectly works on
 a coarsely meshed disk

2) Addition of NETGEN-1D2D3D removes already computed faces of a
  sub-mesh on a group of FACEs (SMESH_subMesh::cleanDependsOn())

3) Volumes are shown, instead of faces, when displaying a sub-mesh on
  a SOLID with only a 2D algo assigned to the sub-mesh (SMESH_subMesh_i.cxx)

src/SMESH/SMESH_MesherHelper.cxx
src/SMESH/SMESH_subMesh.cxx
src/SMESH_I/SMESH_subMesh_i.cxx

index 3703a7215de3c4d0e89733d5da826d9c539f0615..40016a4884233f2ea779157a3c6398107a8dd337 100644 (file)
@@ -2904,6 +2904,10 @@ bool SMESH_MesherHelper::IsReversedSubMesh (const TopoDS_Face& theFace)
             bool ok = true;
             double u0 = GetNodeU( TopoDS::Edge( E ), nn[0], nn[1], &ok );
             double u1 = GetNodeU( TopoDS::Edge( E ), nn[1], nn[0], &ok );
             bool ok = true;
             double u0 = GetNodeU( TopoDS::Edge( E ), nn[0], nn[1], &ok );
             double u1 = GetNodeU( TopoDS::Edge( E ), nn[1], nn[0], &ok );
+            // check that the 2 nodes are connected with a segment (IPAL53055)
+            // if ( SMESHDS_SubMesh* sm = GetMeshDS()->MeshElements( E ))
+            //   if ( sm->NbElements() > 0 && !GetMeshDS()->FindEdge( nn[0], nn[1] ))
+            //     ok = false;
             if ( ok )
             {
               isReversed = ( u0 > u1 );
             if ( ok )
             {
               isReversed = ( u0 > u1 );
index 38a44570802e1d6ee81e7a912518f4ff68123752..f395b7986c23b00d64c18f8984cb50ca2634aed0 100644 (file)
@@ -1217,8 +1217,6 @@ void SMESH_subMesh::cleanDependsOn( SMESH_Algo* algoRequiringCleaning/*=0*/ )
   }
   else if ( algoRequiringCleaning && algoRequiringCleaning->SupportSubmeshes() )
   {
   }
   else if ( algoRequiringCleaning && algoRequiringCleaning->SupportSubmeshes() )
   {
-    SMESHDS_Mesh* meshDS = _father->GetMeshDS();
-
     // find sub-meshes to keep elements on
     set< SMESH_subMesh* > smToKeep;
     TopAbs_ShapeEnum prevShapeType = TopAbs_SHAPE;
     // find sub-meshes to keep elements on
     set< SMESH_subMesh* > smToKeep;
     TopAbs_ShapeEnum prevShapeType = TopAbs_SHAPE;
@@ -1242,13 +1240,14 @@ void SMESH_subMesh::cleanDependsOn( SMESH_Algo* algoRequiringCleaning/*=0*/ )
         }
         if ( !keepSubMeshes )
         {
         }
         if ( !keepSubMeshes )
         {
-          // look for an algo assigned to sm
-          bool algoFound = false;
-          const list<const SMESHDS_Hypothesis*>& hyps = meshDS->GetHypothesis( sm->_subShape );
-          list<const SMESHDS_Hypothesis*>::const_iterator h = hyps.begin();
-          for ( ; ( !algoFound && h != hyps.end() ); ++h )
-            algoFound = ((*h)->GetType() != SMESHDS_Hypothesis::PARAM_ALGO );
-          keepSubMeshes = algoFound;
+          // look for a local algo used to mesh sm
+          TopoDS_Shape algoShape = SMESH_MesherHelper::GetShapeOfHypothesis
+            ( algoRequiringCleaning, _subShape, _father );
+          SMESH_HypoFilter moreLocalAlgo;
+          moreLocalAlgo.Init( SMESH_HypoFilter::IsMoreLocalThan( algoShape, *_father ));
+          moreLocalAlgo.And ( SMESH_HypoFilter::IsAlgo() );
+          bool localAlgoFound = _father->GetHypothesis( sm->_subShape, moreLocalAlgo, true );
+          keepSubMeshes = localAlgoFound;
         }
         // remember all sub-meshes of sm
         if ( keepSubMeshes )
         }
         // remember all sub-meshes of sm
         if ( keepSubMeshes )
index ee9117e2cae0528bd925a1dbe019ea5f7e8151b5..bc0fa18c8ca73036cc3b6c228aa5ea84fc4a7efe 100644 (file)
@@ -107,9 +107,10 @@ bool getSubMeshes(::SMESH_subMesh*  theSubMesh,
   TopAbs_ShapeEnum aShapeType = aShape.ShapeType();
 
   // IPAL18558: Wrong information of the created sub-mesh is shown. (Sub-mesh on a FACE
   TopAbs_ShapeEnum aShapeType = aShape.ShapeType();
 
   // IPAL18558: Wrong information of the created sub-mesh is shown. (Sub-mesh on a FACE
-  // with only 1D algo assigned
+  // with only 1D algo assigned)
   // Find dimension of sub-meshes to return as highest dimension of the assigned algorithm
   // Find dimension of sub-meshes to return as highest dimension of the assigned algorithm
-  if ( theSubMesh->IsEmpty() && !theSubMesh->GetAlgo() )
+  if (( theSubMesh->IsEmpty() || ( aSubMeshDS && aSubMeshDS->IsComplexSubmesh() )) &&
+      ( !theSubMesh->GetAlgo() ))
   {
     // on father sub-meshes, check presence of an algo which will mesh this sub-mesh
     // even if no algo is assigned to this sub-mesh
   {
     // on father sub-meshes, check presence of an algo which will mesh this sub-mesh
     // even if no algo is assigned to this sub-mesh
@@ -121,20 +122,22 @@ bool getSubMeshes(::SMESH_subMesh*  theSubMesh,
 
     if ( !topAlgoPresent )
     {
 
     if ( !topAlgoPresent )
     {
-      // look for a sub-mesh with an algo
-      SMESH_subMeshIteratorPtr smIt =
-        theSubMesh->getDependsOnIterator(/*includeSelf=*/false, /*complexShapeFirst=*/true);
+      // find max dimension of an assigned algo
       TopAbs_ShapeEnum algoShape = TopAbs_SHAPE;
       TopAbs_ShapeEnum algoShape = TopAbs_SHAPE;
-      while ( smIt->more() && algoShape == TopAbs_SHAPE )
-      {
-        sm = smIt->next();
-        if ( sm->GetAlgo() )
-          algoShape = sm->GetSubShape().ShapeType();
-      }
+      const std::list <const SMESHDS_Hypothesis * >& hyps = aMesh->GetHypothesisList( aShape );
+      std::list <const SMESHDS_Hypothesis * >::const_iterator hypIt = hyps.begin();
+      for ( ; hypIt != hyps.end(); ++hypIt )
+        if ( const SMESH_Algo* algo = dynamic_cast< const SMESH_Algo* >( *hypIt ))
+          switch ( algo->GetDim() ) {
+          case 1: algoShape = TopAbs_EDGE; break;
+          case 2: algoShape = TopAbs_FACE; break;
+          case 3: algoShape = TopAbs_SOLID; break;
+          case 0: algoShape = TopAbs_VERTEX; break;
+          }
       if ( algoShape != TopAbs_SHAPE )
       {
       if ( algoShape != TopAbs_SHAPE )
       {
-        // return all sub-meshes on this shape type
-        smIt = theSubMesh->getDependsOnIterator(/*includeSelf=*/false, /*complexShapeFirst=*/true);
+        // return all sub-meshes on this dimension
+        SMESH_subMeshIteratorPtr smIt = theSubMesh->getDependsOnIterator(/*includeSelf=*/false);
         while ( smIt->more() )
         {
           sm = smIt->next();
         while ( smIt->more() )
         {
           sm = smIt->next();
@@ -209,6 +212,8 @@ CORBA::Long SMESH_subMesh_i::GetNumberOfElements()
 
   ::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId];
   SMESHDS_SubMesh* aSubMeshDS = aSubMesh->GetSubMeshDS();
 
   ::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId];
   SMESHDS_SubMesh* aSubMeshDS = aSubMesh->GetSubMeshDS();
+  if ( aSubMeshDS && aSubMeshDS->IsComplexSubmesh() )
+    aSubMeshDS = 0;
 
   int nbElems = aSubMeshDS ? aSubMeshDS->NbElements() : 0;
 
 
   int nbElems = aSubMeshDS ? aSubMeshDS->NbElements() : 0;
 
@@ -244,6 +249,8 @@ CORBA::Long SMESH_subMesh_i::GetNumberOfNodes(CORBA::Boolean all)
   }
   ::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId];
   SMESHDS_SubMesh* aSubMeshDS = aSubMesh->GetSubMeshDS();
   }
   ::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId];
   SMESHDS_SubMesh* aSubMeshDS = aSubMesh->GetSubMeshDS();
+  if ( aSubMeshDS && aSubMeshDS->IsComplexSubmesh() )
+    aSubMeshDS = 0;
 
   if ( aSubMeshDS && aSubMeshDS->IsComplexSubmesh() )
   {
 
   if ( aSubMeshDS && aSubMeshDS->IsComplexSubmesh() )
   {
@@ -292,6 +299,8 @@ SMESH::long_array* SMESH_subMesh_i::GetElementsId()
 
   ::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId];
   SMESHDS_SubMesh* aSubMeshDS = aSubMesh->GetSubMeshDS();
 
   ::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId];
   SMESHDS_SubMesh* aSubMeshDS = aSubMesh->GetSubMeshDS();
+  if ( aSubMeshDS && aSubMeshDS->IsComplexSubmesh() )
+    aSubMeshDS = 0;
 
   int nbElems = aSubMeshDS ? aSubMeshDS->NbElements() : 0;
   TListOfSubMeshes smList;
 
   int nbElems = aSubMeshDS ? aSubMeshDS->NbElements() : 0;
   TListOfSubMeshes smList;
@@ -342,6 +351,8 @@ SMESH::long_array* SMESH_subMesh_i::GetElementsByType( SMESH::ElementType theEle
 
   ::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId];
   SMESHDS_SubMesh* aSubMeshDS = aSubMesh->GetSubMeshDS();
 
   ::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId];
   SMESHDS_SubMesh* aSubMeshDS = aSubMesh->GetSubMeshDS();
+  if ( aSubMeshDS && aSubMeshDS->IsComplexSubmesh() )
+    aSubMeshDS = 0;
 
   // PAL5440, return all nodes belonging to elements of submesh
   set<int> nodeIds;
 
   // PAL5440, return all nodes belonging to elements of submesh
   set<int> nodeIds;