Salome HOME
Fix for PAL7758(Incorrect work of "Lying on Geom" filter for faces).
authormzn <mzn@opencascade.com>
Thu, 20 Jan 2005 11:50:07 +0000 (11:50 +0000)
committermzn <mzn@opencascade.com>
Thu, 20 Jan 2005 11:50:07 +0000 (11:50 +0000)
LyingOnGeom::Contains(...) improved.

src/SMESH_I/SMESH_Filter_i.cxx

index a5c073f29dd364497cbebc5192633d2e001f88f7..95893bc0eb2a956816822096a72b1408e83cdf5c 100644 (file)
@@ -268,43 +268,31 @@ bool Controls::LyingOnGeom::Contains( SMESHDS_Mesh*           theMeshDS,
   if (IsContains(theMeshDS, theShape, theElem, theFindShapeEnum, theAvoidShapeEnum))
     return true;
   
-  if ( SMESHDS_SubMesh* aSubMesh = theMeshDS->MeshElements( theShape ) )
-    {
-      SMDS_NodeIteratorPtr aNodeIt = aSubMesh->GetNodes();
-      while ( aNodeIt->more() )
-       {
-         const SMDS_MeshNode* aNode = static_cast<const SMDS_MeshNode*>(aNodeIt->next());
-         SMDS_ElemIteratorPtr anElemIt = aNode->GetInverseElementIterator();
-         while ( anElemIt->more() )
-           {
-             const SMDS_MeshElement* anElement = static_cast<const SMDS_MeshElement*>(anElemIt->next());
-             if (anElement == theElem)
-               return true;
-           }
-       }
-    }
+  TopTools_IndexedMapOfShape aSubShapes;
+  TopExp::MapShapes( theShape, aSubShapes );
   
-  TopExp_Explorer anExp( theShape,TopAbs_VERTEX,theAvoidShapeEnum );
-
-  while( anExp.More() )
-  {
-    const TopoDS_Shape& aShape = anExp.Current();
-    if( SMESHDS_SubMesh* aSubMesh = theMeshDS->MeshElements( aShape ) ){
-      SMDS_NodeIteratorPtr aNodeIt = aSubMesh->GetNodes();
-      while ( aNodeIt->more() )
-       {
-         const SMDS_MeshNode* aNode = static_cast<const SMDS_MeshNode*>(aNodeIt->next());
-         SMDS_ElemIteratorPtr anElemIt = aNode->GetInverseElementIterator();
-         while ( anElemIt->more() )
-           {
-             const SMDS_MeshElement* anElement = static_cast<const SMDS_MeshElement*>(anElemIt->next());
-             if (anElement == theElem)
-               return true;
-           }
-       }
+  for (int i = 1; i <= aSubShapes.Extent(); i++)
+    {
+      const TopoDS_Shape& aShape = aSubShapes.FindKey(i);
+      
+      if( SMESHDS_SubMesh* aSubMesh = theMeshDS->MeshElements( aShape ) ){
+       if( aSubMesh->Contains( theElem ) )
+         return true;
+       
+       SMDS_NodeIteratorPtr aNodeIt = aSubMesh->GetNodes();
+       while ( aNodeIt->more() )
+         {
+           const SMDS_MeshNode* aNode = static_cast<const SMDS_MeshNode*>(aNodeIt->next());
+           SMDS_ElemIteratorPtr anElemIt = aNode->GetInverseElementIterator();
+           while ( anElemIt->more() )
+             {
+               const SMDS_MeshElement* anElement = static_cast<const SMDS_MeshElement*>(anElemIt->next());
+               if (anElement == theElem)
+                 return true;
+             }
+         }
+      }
     }
-    anExp.Next();
-  }
   return false;
 }