Salome HOME
Fix regression: storeViewParameters() does not work for OCC view
[modules/geom.git] / src / GEOMAlgo / GEOMAlgo_BuilderSolid.cxx
index 6ea231c3ecb7ab2837908e77bb848d42d1d7e78e..07be8c7fbe22aa6a068c3a5a58276ca07d0ac694 100755 (executable)
@@ -1,4 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
-// File:       GEOMAlgo_BuilderSolid.cxx
-// Created:    
-// Author:     Peter KURNEV 
+
+// File:        GEOMAlgo_BuilderSolid.cxx
+// Created:     
+// Author:      Peter KURNEV 
 //
 #include <GEOMAlgo_BuilderSolid.ixx>
 
 //
 static
   Standard_Boolean IsGrowthShell(const TopoDS_Shape& ,
-                                const TopTools_IndexedMapOfShape& );
+                                 const TopTools_IndexedMapOfShape& );
 static
   Standard_Boolean IsHole(const TopoDS_Shape& ,
-                         IntTools_PContext& );
+                          IntTools_PContext& );
 static
   Standard_Boolean IsInside(const TopoDS_Shape& ,
-                           const TopoDS_Shape& ,
-                           IntTools_PContext& );
+                            const TopoDS_Shape& ,
+                            IntTools_PContext& );
 static
   void MakeInternalShells(const TopTools_MapOfShape& ,
-                         TopTools_ListOfShape& );
+                          TopTools_ListOfShape& );
+
+static
+  Standard_Boolean IsClosedShell(const TopoDS_Shell& );
 
-//modified by NIZNHY-PKV Tue Aug  5 15:06:50 2008f
+//modified by NIZNHY-PKV Tue Oct 26 13:30:39 2010f
 static
-  Standard_Boolean IsClosedShell(const TopoDS_Shell& theShell);
-//modified by NIZNHY-PKV Tue Aug  5 15:06:57 2008t
+  Standard_Boolean RefineShell(const TopoDS_Shell& , 
+                              TopoDS_Shell& );
+//modified by NIZNHY-PKV Tue Oct 26 13:30:42 2010t
 
 //=======================================================================
 //function : 
@@ -184,65 +189,67 @@ static
     for (; aIt.More(); aIt.Next()) {
       const TopoDS_Shape& aF=aIt.Value();
       if (!myShapesToAvoid.Contains(aF)) {
-       TopExp::MapShapesAndAncestors(aF, TopAbs_EDGE, TopAbs_FACE, aMEF);
+        TopExp::MapShapesAndAncestors(aF, TopAbs_EDGE, TopAbs_FACE, aMEF);
       }
-      else {
-       int a=0;
+      /*
+      else { 
+       int a=0; 
       }
+      */
     }
     aNbE=aMEF.Extent();
     //
     // 2. myFacesToAvoid
     for (i=1; i<=aNbE; ++i) {
-      const TopoDS_Edge& aE=TopoDS::Edge(aMEF.FindKey(i));
+      const TopoDS_Edge& aE=*((TopoDS_Edge*)(&aMEF.FindKey(i)));
       if (BRep_Tool::Degenerated(aE)) {
-       continue;
+        continue;
       }
       //
       TopTools_ListOfShape& aLF=aMEF.ChangeFromKey(aE);
       //
       aNbF=aLF.Extent();
       if (!aNbF) {
-       continue;
+        continue;
       }
       //
       aOrE=aE.Orientation();
       //
-      const TopoDS_Face& aF1=TopoDS::Face(aLF.First());
+      const TopoDS_Face& aF1=*((TopoDS_Face*)(&aLF.First()));
       if (aNbF==1) {
-       if (aOrE==TopAbs_INTERNAL) {
-         continue;
-       }
-       bFound=Standard_True;
-       myShapesToAvoid.Add(aF1);
+        if (aOrE==TopAbs_INTERNAL) {
+          continue;
+        }
+        bFound=Standard_True;
+        myShapesToAvoid.Add(aF1);
       }
       else if (aNbF==2) {
-       const TopoDS_Face& aF2=TopoDS::Face(aLF.Last());
-       if (aF2.IsSame(aF1)) {
-         if (BRep_Tool::IsClosed(aE, aF1)) {
-           continue;
-         }
-         //
-         if (aOrE==TopAbs_INTERNAL) {
-           continue;
-         }
-         //
-         bFound=Standard_True;
-         myShapesToAvoid.Add(aF1);
-         myShapesToAvoid.Add(aF2);
-       }
+        const TopoDS_Face& aF2=*((TopoDS_Face*)(&aLF.Last()));
+        if (aF2.IsSame(aF1)) {
+          if (BRep_Tool::IsClosed(aE, aF1)) {
+            continue;
+          }
+          //
+          if (aOrE==TopAbs_INTERNAL) {
+            continue;
+          }
+          //
+          bFound=Standard_True;
+          myShapesToAvoid.Add(aF1);
+          myShapesToAvoid.Add(aF2);
+        }
       }
-      //DEB
+      /*//DEB         
       else {
-       TopTools_ListIteratorOfListOfShape aItLF;
-       //
-       aItLF.Initialize (aLF);
-       for (; aItLF.More(); aItLF.Next()) {
-         const TopoDS_Shape& aFx=aItLF.Value();
-         int a=0;
-       }
+        TopTools_ListIteratorOfListOfShape aItLF;
+        //
+        aItLF.Initialize (aLF);
+        for (; aItLF.More(); aItLF.Next()) {
+          const TopoDS_Shape& aFx=aItLF.Value();
+          int a=0;
+        }
       }
-      //DEB
+      *///DEB
     }// for (i=1; i<=aNbE; ++i) {
     //
     if (!bFound) {
@@ -261,12 +268,12 @@ static
   //
   myLoops.Clear();
   //
-  Standard_Integer aNbLF, aNbOff, aNbFP, aNbFA;
+  Standard_Integer aNbLF, aNbOff, aNbFP;
   TopAbs_Orientation anOr;
   TopoDS_Edge aEL;
   BRep_Builder aBB;
   NMTTools_CoupleOfShape aCSOff;
-  TopTools_MapOfOrientedShape AddedFacesMap;//, aMFP;
+  TopTools_MapOfOrientedShape AddedFacesMap;
   TopTools_IndexedDataMapOfShapeListOfShape aEFMap, aMEFP;
   TopTools_ListIteratorOfListOfShape aItF, aIt;
   TopTools_MapIteratorOfMapOfOrientedShape aItM;
@@ -303,104 +310,102 @@ static
     // loop on faces added to Shell; add their neighbor faces to Shell and so on
     TopoDS_Iterator aItAddedF (aShell);
     for (; aItAddedF.More(); aItAddedF.Next()) {
-      const TopoDS_Face& aF = TopoDS::Face(aItAddedF.Value());
+      const TopoDS_Face& aF = *((TopoDS_Face*)(&aItAddedF.Value()));
       //
       // loop on edges of aF; find a good neighbor face of aF by aE
       TopExp_Explorer aEdgeExp(aF, TopAbs_EDGE);
       for (; aEdgeExp.More(); aEdgeExp.Next()) {
-        const TopoDS_Edge& aE = TopoDS::Edge(aEdgeExp.Current());
-       //
-       //1
-       if (aMEFP.Contains(aE)) {
-         const TopTools_ListOfShape& aLFP=aMEFP.FindFromKey(aE);
-         aNbFP=aLFP.Extent();
-         if (aNbFP>1) { 
-           continue;
-         }
-       }
-       //2
-       anOr=aE.Orientation();
-       if (anOr==TopAbs_INTERNAL) {
-         continue;
-       }
-       //3
-       if (BRep_Tool::Degenerated(aE)) {
-         continue;
-       }
-       //
-       // candidate faces list
+        const TopoDS_Edge& aE=*((TopoDS_Edge*)(&aEdgeExp.Current()));
+        //
+        //1
+        if (aMEFP.Contains(aE)) {
+          const TopTools_ListOfShape& aLFP=aMEFP.FindFromKey(aE);
+          aNbFP=aLFP.Extent();
+          if (aNbFP>1) { 
+            continue;
+          }
+        }
+        //2
+        anOr=aE.Orientation();
+        if (anOr==TopAbs_INTERNAL) {
+          continue;
+        }
+        //3
+        if (BRep_Tool::Degenerated(aE)) {
+          continue;
+        }
+        //
+        // candidate faces list
         const TopTools_ListOfShape& aLF=aEFMap.FindFromKey(aE);
-       aNbLF=aLF.Extent();
+        aNbLF=aLF.Extent();
         if (!aNbLF) {
           continue;
-       }
-       //
-       // try to select one of neighbors
-       // check if a face already added to Shell shares E
-       Standard_Boolean bFound;
-       TopTools_ListIteratorOfListOfShape aItLF;
-       NMTTools_ListOfCoupleOfShape aLCSOff;
-       //
-       aItLF.Initialize(aLF);
-       for (; aItLF.More(); aItLF.Next()) { 
-         const TopoDS_Face& aFL=TopoDS::Face(aItLF.Value());
-         if (myShapesToAvoid.Contains(aFL)) {
-           continue;
-         }
-         if (aF.IsSame(aFL)) {
-           continue;
-         } 
-         if (AddedFacesMap.Contains(aFL)){
-           continue;
-         }
-         //
-         bFound=GEOMAlgo_Tools3D::GetEdgeOff(aE, aFL, aEL);
-         if (!bFound) {
-           continue;
-         }
-         //
-         aCSOff.SetShape1(aEL);
-         aCSOff.SetShape2(aFL);
-         aLCSOff.Append(aCSOff);
-       }//for (; aItLF.More(); aItLF.Next()) { 
-       //
-       aNbOff=aLCSOff.Extent();
-       if (!aNbOff){
-         continue;
-       }
-       //
-       TopoDS_Face aSelF;
-       if (aNbOff==1) {
-         aSelF=TopoDS::Face(aLCSOff.First().Shape2());
-       }
-       else if (aNbOff>1){
-         GEOMAlgo_Tools3D::GetFaceOff(aE, aF, aLCSOff, aSelF);
-       }
-       //
+        }
+        //
+        // try to select one of neighbors
+        // check if a face already added to Shell shares E
+        Standard_Boolean bFound;
+        TopTools_ListIteratorOfListOfShape aItLF;
+        NMTTools_ListOfCoupleOfShape aLCSOff;
+        //
+        aItLF.Initialize(aLF);
+        for (; aItLF.More(); aItLF.Next()) { 
+          const TopoDS_Face& aFL=*((TopoDS_Face*)(&aItLF.Value()));
+          if (myShapesToAvoid.Contains(aFL)) {
+            continue;
+          }
+          if (aF.IsSame(aFL)) {
+            continue;
+          
+          if (AddedFacesMap.Contains(aFL)){
+            continue;
+          }
+          //
+          bFound=GEOMAlgo_Tools3D::GetEdgeOff(aE, aFL, aEL);
+          if (!bFound) {
+            continue;
+          }
+          //
+          aCSOff.SetShape1(aEL);
+          aCSOff.SetShape2(aFL);
+          aLCSOff.Append(aCSOff);
+        }//for (; aItLF.More(); aItLF.Next()) { 
+        //
+        aNbOff=aLCSOff.Extent();
+        if (!aNbOff){
+          continue;
+        }
+        //
+        TopoDS_Face aSelF;
+        if (aNbOff==1) {
+          aSelF=*((TopoDS_Face*)(&aLCSOff.First().Shape2()));
+        }
+        else if (aNbOff>1){
+          GEOMAlgo_Tools3D::GetFaceOff(aE, aF, aLCSOff, aSelF);
+        }
+        //
         if (!aSelF.IsNull() && AddedFacesMap.Add(aSelF)) { 
           aBB.Add(aShell, aSelF);
-         TopExp::MapShapesAndAncestors(aSelF, TopAbs_EDGE, TopAbs_FACE, aMEFP);
-       }
+          TopExp::MapShapesAndAncestors(aSelF, TopAbs_EDGE, TopAbs_FACE, aMEFP);
+        }
       } // for (; aEdgeExp.More(); aEdgeExp.Next()) { 
     } //for (; aItAddedF.More(); aItAddedF.Next()) {
-    //modified by NIZNHY-PKV Tue Aug  5 15:07:08 2008f
-    //myLoops.Append(aShell);
+    //
     if (IsClosedShell(aShell)) {
       myLoops.Append(aShell);
     }
-    /*
+    //modified by NIZNHY-PKV Wed Oct 27 07:10:41 2010f
     else {
-      TopoDS_Iterator aItS;
-      aItS.Initialize(aShell);
-      for (; aItS.More(); aItS.Next()) {
-       const TopoDS_Shape& aFs=aItS.Value();
-       aMFP.Add(aFs);
+      Standard_Boolean bRefine;
+      TopoDS_Shell aShx;
+      //
+      bRefine=RefineShell(aShell, aShx);
+      if (bRefine) {
+       myLoops.Append(aShx);
       }
     }
-    */
-    //modified by NIZNHY-PKV Tue Aug  5 15:07:30 2008t
-  } // for (; aItF.More(); aItF.Next()) {
-  //modified by NIZNHY-PKV Tue Aug  5 15:07:35 2008f
+    //modified by NIZNHY-PKV Wed Oct 27 07:10:44 2010t
+  } // for (; aItF.More(); aItF.Next()) { 
   //
   // Post Treatment
   TopTools_MapOfOrientedShape aMP;
@@ -416,14 +421,14 @@ static
     }
   }
   // 
-  // b. collect all edges that are to avoid
+  // b. collect all faces that are to avoid
   aItM.Initialize(myShapesToAvoid);
   for (; aItM.More(); aItM.Next()) {
     const TopoDS_Shape& aF=aItM.Key();
     aMP.Add(aF);
   }
   //
-  // c. add all edges that are not processed to myShapesToAvoid
+  // c. add all faces that are not processed to myShapesToAvoid
   aIt.Initialize (myShapes);
   for (; aIt.More(); aIt.Next()) {
     const TopoDS_Shape& aF=aIt.Value();
@@ -431,7 +436,6 @@ static
       myShapesToAvoid.Add(aF);
     }
   }
-  //modified by NIZNHY-PKV Tue Aug  5 15:07:44 2008t
   //=================================================
   //
   // 2.Internal Shells
@@ -441,8 +445,6 @@ static
   aEFMap.Clear();
   AddedFacesMap.Clear();
   //
-  aNbFA=myShapesToAvoid.Extent();
-  //
   aItM.Initialize(myShapesToAvoid);
   for (; aItM.More(); aItM.Next()) {
     const TopoDS_Shape& aFF=aItM.Key();
@@ -463,19 +465,19 @@ static
     //
     TopoDS_Iterator aItAddedF (aShell);
     for (; aItAddedF.More(); aItAddedF.Next()) {
-      const TopoDS_Face& aF = TopoDS::Face(aItAddedF.Value());
+      const TopoDS_Face& aF = *((TopoDS_Face*)(&aItAddedF.Value()));
       //
       TopExp_Explorer aEdgeExp(aF, TopAbs_EDGE);
       for (; aEdgeExp.More(); aEdgeExp.Next()) {
-        const TopoDS_Edge& aE = TopoDS::Edge(aEdgeExp.Current());
-       const TopTools_ListOfShape& aLF=aEFMap.FindFromKey(aE);
-       aItF.Initialize(aLF);
-       for (; aItF.More(); aItF.Next()) { 
-         const TopoDS_Face& aFL=TopoDS::Face(aItF.Value());
-         if (AddedFacesMap.Add(aFL)){
-           aBB.Add(aShell, aFL);
-         }
-       }
+        const TopoDS_Edge& aE = *((TopoDS_Edge*)(&aEdgeExp.Current()));
+        const TopTools_ListOfShape& aLF=aEFMap.FindFromKey(aE);
+        aItF.Initialize(aLF);
+        for (; aItF.More(); aItF.Next()) { 
+          const TopoDS_Face& aFL=*((TopoDS_Face*)(&aItF.Value()));
+          if (AddedFacesMap.Add(aFL)){
+            aBB.Add(aShell, aFL);
+          }
+        }
       }
     }
     myLoopsInternal.Append(aShell);
@@ -517,21 +519,19 @@ static
     }
     else{
       // check if a shell is a hole
-      //XX
       bIsHole=IsHole(aShell, myContext);
-      //bIsHole=GEOMAlgo_BuilderTools::IsHole(aShell);
-      //XX
+      //
       if (bIsHole) {
-       aHoleShells.Append(aShell);
-       TopExp::MapShapes(aShell, TopAbs_FACE, aMHF);
+        aHoleShells.Append(aShell);
+        TopExp::MapShapes(aShell, TopAbs_FACE, aMHF);
       }
       else {
-       // make a growth solid from a shell
-       TopoDS_Solid Solid;
-       aBB.MakeSolid(Solid);
-       aBB.Add (Solid, aShell);
-       //
-       aNewSolids.Append (Solid);
+        // make a growth solid from a shell
+        TopoDS_Solid Solid;
+        aBB.MakeSolid(Solid);
+        aBB.Add (Solid, aShell);
+        //
+        aNewSolids.Append (Solid);
       }
     }
   }
@@ -565,13 +565,13 @@ static
     if (aInOutMap.IsBound(aHole)){
       const TopoDS_Shape& aSolid=aInOutMap(aHole);
       if (aMSH.IsBound(aSolid)) {
-       TopTools_ListOfShape& aLH=aMSH.ChangeFind(aSolid);
-       aLH.Append(aHole);
+        TopTools_ListOfShape& aLH=aMSH.ChangeFind(aSolid);
+        aLH.Append(aHole);
       }
       else {
-       TopTools_ListOfShape aLH;
-       aLH.Append(aHole);
-       aMSH.Bind(aSolid, aLH);
+        TopTools_ListOfShape aLH;
+        aLH.Append(aHole);
+        aMSH.Bind(aSolid, aLH);
       }
       //aBB.Add (aSolid, aHole);
     }
@@ -580,7 +580,7 @@ static
   // 3. Add aHoles to Solids
   aItMSH.Initialize(aMSH);
   for (; aItMSH.More(); aItMSH.Next()) {
-    TopoDS_Solid aSolid=TopoDS::Solid(aItMSH.Key());
+    TopoDS_Solid aSolid=*((TopoDS_Solid*)(&aItMSH.Key()));
     //
     const TopTools_ListOfShape& aLH=aItMSH.Value();
     aShellIt.Initialize(aLH);
@@ -636,7 +636,7 @@ static
   // 2 Process solids
   aSolidIt.Initialize(myAreas);
   for ( ; aSolidIt.More(); aSolidIt.Next()) {
-    TopoDS_Solid& aSolid=TopoDS::Solid(aSolidIt.Value());
+    TopoDS_Solid& aSolid=*((TopoDS_Solid*)(&aSolidIt.Value()));
     //
     aMEF.Clear();
     TopExp::MapShapesAndAncestors(aSolid, TopAbs_EDGE, TopAbs_FACE, aMEF);
@@ -645,9 +645,9 @@ static
     aMFP.Clear();
     aItMF.Initialize(aMF);
     for (; aItMF.More(); aItMF.Next()) {
-      const TopoDS_Face& aF=TopoDS::Face(aItMF.Key());
+      const TopoDS_Face& aF=*((TopoDS_Face*)(&aItMF.Key()));
       if (GEOMAlgo_Tools3D::IsInternalFace(aF, aSolid, aMEF, 1.e-14, *myContext)) {
-       aMFP.Add(aF);
+        aMFP.Add(aF);
       }
     }
     //
@@ -681,7 +681,7 @@ static
 //purpose  : 
 //=======================================================================
 void MakeInternalShells(const TopTools_MapOfShape& theMF,
-                       TopTools_ListOfShape& theShells)
+                        TopTools_ListOfShape& theShells)
 {
   TopTools_MapIteratorOfMapOfShape aItM;
   TopTools_MapOfShape aAddedFacesMap;
@@ -715,15 +715,15 @@ void MakeInternalShells(const TopTools_MapOfShape& theMF,
       TopExp_Explorer aEdgeExp(aF, TopAbs_EDGE);
       for (; aEdgeExp.More(); aEdgeExp.Next()) {
         const TopoDS_Shape& aE =aEdgeExp.Current();
-       const TopTools_ListOfShape& aLF=aMEF.FindFromKey(aE);
-       aItF.Initialize(aLF);
-       for (; aItF.More(); aItF.Next()) { 
-         TopoDS_Shape aFL=aItF.Value();
-         if (aAddedFacesMap.Add(aFL)){
-           aFL.Orientation(TopAbs_INTERNAL);
-           aBB.Add(aShell, aFL);
-         }
-       }
+        const TopTools_ListOfShape& aLF=aMEF.FindFromKey(aE);
+        aItF.Initialize(aLF);
+        for (; aItF.More(); aItF.Next()) { 
+          TopoDS_Shape aFL=aItF.Value();
+          if (aAddedFacesMap.Add(aFL)){
+            aFL.Orientation(TopAbs_INTERNAL);
+            aBB.Add(aShell, aFL);
+          }
+        }
       }
     }
     theShells.Append(aShell);
@@ -734,7 +734,7 @@ void MakeInternalShells(const TopTools_MapOfShape& theMF,
 //purpose  : 
 //=======================================================================
 Standard_Boolean IsHole(const TopoDS_Shape& theS2,
-                       IntTools_PContext& theContext)
+                        IntTools_PContext& theContext)
 {
   TopoDS_Solid *pS2=(TopoDS_Solid *)&theS2;
   BRepClass3d_SolidClassifier& aClsf=theContext->SolidClassifier(*pS2);
@@ -748,8 +748,8 @@ Standard_Boolean IsHole(const TopoDS_Shape& theS2,
 //purpose  : 
 //=======================================================================
 Standard_Boolean IsInside(const TopoDS_Shape& theS1,
-                         const TopoDS_Shape& theS2,
-                         IntTools_PContext& theContext)
+                          const TopoDS_Shape& theS2,
+                          IntTools_PContext& theContext)
 {
   TopExp_Explorer aExp;
   TopAbs_State aState;
@@ -774,7 +774,7 @@ Standard_Boolean IsInside(const TopoDS_Shape& theS1,
 //purpose  : 
 //=======================================================================
 Standard_Boolean IsGrowthShell(const TopoDS_Shape& theShell,
-                              const TopTools_IndexedMapOfShape& theMHF)
+                               const TopTools_IndexedMapOfShape& theMHF)
 {
   Standard_Boolean bRet;
   TopoDS_Iterator aIt;
@@ -785,13 +785,12 @@ Standard_Boolean IsGrowthShell(const TopoDS_Shape& theShell,
     for(; aIt.More(); aIt.Next()) {
       const TopoDS_Shape& aF=aIt.Value();
       if (theMHF.Contains(aF)) {
-       return !bRet;
+        return !bRet;
       }
     }
   }
   return bRet;
 }
-//modified by NIZNHY-PKV Tue Aug  5 15:07:50 2008f
 //=======================================================================
 //function : IsClosedShell
 //purpose  : 
@@ -810,20 +809,17 @@ Standard_Boolean IsClosedShell(const TopoDS_Shell& theShell)
     const TopoDS_Face& aF=TopoDS::Face(aIt.Value());
     aExp.Init(aF, TopAbs_EDGE);
     for (; aExp.More(); aExp.Next()) {
-      const TopoDS_Edge& aE=TopoDS::Edge(aExp.Current());
+      const TopoDS_Edge& aE=*((TopoDS_Edge*)(&aExp.Current()));
       if (BRep_Tool::Degenerated(aE)) {
-       continue;
-      }
-      /*
-      if (BRep_Tool::IsClosed(aE, aF)) {
-       continue;
+        continue;
       }
-      */
+      //
       if (aE.Orientation()==TopAbs_INTERNAL) {
-       continue;
+        continue;
       }
+      //
       if (!aM.Add(aE)) {
-       aM.Remove(aE);
+        aM.Remove(aE);
       }
     }
   }
@@ -834,8 +830,89 @@ Standard_Boolean IsClosedShell(const TopoDS_Shell& theShell)
   }
   return bRet;
 }
-//modified by NIZNHY-PKV Tue Aug  5 15:08:07 2008t
-//BRepTools::Write(aFF, "ff");
+//modified by NIZNHY-PKV Tue Oct 26 13:30:23 2010f
+//=======================================================================
+//function : RefineShell
+//purpose  :
+//=======================================================================
+  Standard_Boolean RefineShell(const TopoDS_Shell& aShell,
+                              TopoDS_Shell& aShx)
+                              
+{
+  Standard_Boolean bRet;
+  Standard_Integer i, aNbE, aNbF;
+  TopAbs_Orientation aOrE;
+  TopTools_IndexedDataMapOfShapeListOfShape aMEF;
+  TopTools_MapOfOrientedShape aMFx;
+  // 
+  bRet=Standard_False;
+  //
+  TopExp::MapShapesAndAncestors(aShell, TopAbs_EDGE, TopAbs_FACE, aMEF);
+  aNbE=aMEF.Extent();
+  for (i=1; i<=aNbE; ++i) {
+    const TopoDS_Edge &aE=*((TopoDS_Edge*)(&aMEF.FindKey(i)));
+    //
+    if (BRep_Tool::Degenerated(aE)) {
+      continue;
+    }
+    //
+    aOrE=aE.Orientation();
+    //
+    const TopTools_ListOfShape& aLF=aMEF(i);
+    aNbF=aLF.Extent();
+    if (!aNbF) {
+      continue;
+    }
+    //
+    const TopoDS_Face& aF1=*((TopoDS_Face*)(&aLF.First()));
+    if (aNbF==1) {
+      if (aOrE==TopAbs_INTERNAL) {
+       continue;
+      }
+      aMFx.Add(aF1);
+    }
+    //
+    else if (aNbF==2) {
+      const TopoDS_Face& aF2=*((TopoDS_Face*)(&aLF.Last()));
+      if (aF2.IsSame(aF1)) {
+       if (BRep_Tool::IsClosed(aE, aF1)) {
+         continue;
+       }
+       if (aOrE==TopAbs_INTERNAL) {
+         continue;
+       }
+       aMFx.Add(aF1);
+       aMFx.Add(aF2);
+      }
+    }
+  }
+  //
+  aNbF=aMFx.Extent();
+  if (!aNbF) {
+    return bRet;
+  } 
+  //
+  BRep_Builder aBB;
+  TopoDS_Iterator aIt;
+  //
+  aNbF=0;
+  aBB.MakeShell(aShx);
+  aIt.Initialize(aShell);
+  for (; aIt.More(); aIt.Next()) {
+    const TopoDS_Shape& aF=aIt.Value();
+    if (!aMFx.Contains(aF)) {
+      aBB.Add(aShx, aF);
+      ++aNbF;
+    }
+  }
+  //
+  if (aNbF) {
+    bRet=IsClosedShell(aShx);
+  }
+  //
+  return bRet;
+}
+//modified by NIZNHY-PKV Tue Oct 26 13:30:26 2010t
 //
 //  ErrorStatus :
 // 11 - Null Context