]> OCCT Git - occt-copy.git/commitdiff
fix for the bug v2.0
authorpkv <pkv@opencascade.com>
Thu, 27 Sep 2012 07:54:50 +0000 (11:54 +0400)
committerpkv <pkv@opencascade.com>
Thu, 27 Sep 2012 07:54:50 +0000 (11:54 +0400)
src/BOP/BOP_CorrectTolerances.cdl
src/BOP/BOP_CorrectTolerances.cxx
src/BOP/BOP_Section.cxx
src/BOP/BOP_ShellShell.cxx
src/BOP/BOP_ShellSolid.cxx
src/BOP/BOP_ShellSplitter.cxx
src/BOP/BOP_SolidSolid.cxx
src/BOP/BOP_WireShell.cxx
src/BOP/BOP_WireSolid.cxx
src/BOP/BOP_WireWire.cxx
src/BOPTools/BOPTools_PaveFiller_5.cxx [new file with mode: 0644]

index b7bd0bef02bb4ee1075131472a6e902ee789a3a3..f145bb45e3c6be25fb3728d134b4b4f025677ff2 100755 (executable)
@@ -31,25 +31,18 @@ uses
     
 is 
     CorrectTolerances      (myclass;  
-                           aS: Shape  from  TopoDS; 
-                           aTolMax: Real from Standard =0.0001);  
+                           aS: Shape  from  TopoDS); 
        ---Purpose:      
        --- Provides valid values of tolerances for the shape <aS>         
-       --- <aTolMax> is max value of the tolerance that can be 
-       --- accepted for correction.  If real value of the tolerance 
-       --- will be greater than  <aTolMax>, the correction does not 
-       --- perform. 
-       ---
     CorrectCurveOnSurface  (myclass;  
-                           aS: Shape  from  TopoDS; 
-                           aTolMax: Real from Standard =0.0001); 
+                           aS: Shape  from  TopoDS); 
        ---Purpose:      
        --- Provides valid values of tolerances for the shape <aS> 
        --- in  terms of BRepCheck_InvalidCurveOnSurface.   
        ---
     CorrectPointOnCurve    (myclass;  
-                           aS: Shape  from  TopoDS; 
-                           aTolMax: Real from Standard =0.0001);                   
+                           aS: Shape  from  TopoDS); 
        ---Purpose:      
        --- Provides valid values of tolerances for the shape <aS> 
        --- in  terms of BRepCheck_InvalidPointOnCurve.   
index 0c23a53b28da3e0719c48c3b37c0c5940dddeab4..f81b758d54c5dd1540e42fb0c8f7848f71e5e39e 100755 (executable)
 
 
 static 
-  void CheckEdge (const TopoDS_Edge& E,
-                 const Standard_Real aMaxTol);
+  void CheckEdge (const TopoDS_Edge& E);
 static 
   void CorrectEdgeTolerance (const TopoDS_Edge& myShape,
-                            const TopoDS_Face& S,
-                            const Standard_Real aMaxTol);
+                            const TopoDS_Face& S);
 static 
   Standard_Boolean Validate(const Adaptor3d_Curve& CRef,
                         const Adaptor3d_Curve& Other,
@@ -87,24 +85,20 @@ static
 static
   void CorrectVertexTolerance(const TopoDS_Edge& aE);
 //
-
 //=======================================================================
 // Function : CorrectTolerances
 // purpose : 
 //=======================================================================
-  void BOP_CorrectTolerances::CorrectTolerances(const TopoDS_Shape& aShape,
-                                               const Standard_Real aMaxTol)
+  void BOP_CorrectTolerances::CorrectTolerances(const TopoDS_Shape& aShape)
 {
-  BOP_CorrectTolerances::CorrectPointOnCurve(aShape, aMaxTol);
-  BOP_CorrectTolerances::CorrectCurveOnSurface(aShape, aMaxTol);
+  BOP_CorrectTolerances::CorrectPointOnCurve(aShape);
+  BOP_CorrectTolerances::CorrectCurveOnSurface(aShape);
 }
-
 //=======================================================================
 // Function : CorrectPointOnCurve
 // purpose : 
 //=======================================================================
-  void BOP_CorrectTolerances::CorrectPointOnCurve(const TopoDS_Shape& S,
-                                                 const Standard_Real aMaxTol)
+  void BOP_CorrectTolerances::CorrectPointOnCurve(const TopoDS_Shape& S)
 {
   Standard_Integer i, aNb;
   TopTools_IndexedMapOfShape Edges;
@@ -112,7 +106,7 @@ static
   aNb=Edges.Extent();
   for (i=1; i<=aNb; i++) {
     const TopoDS_Edge& E= TopoDS::Edge(Edges(i));
-    CheckEdge(E, aMaxTol);
+    CheckEdge(E);
   }     
 }
 
@@ -120,8 +114,7 @@ static
 // Function : CorrectCurveOnSurface
 // purpose : 
 //=======================================================================
-  void BOP_CorrectTolerances::CorrectCurveOnSurface(const TopoDS_Shape& S,
-                                                   const Standard_Real aMaxTol)
+  void BOP_CorrectTolerances::CorrectCurveOnSurface(const TopoDS_Shape& S)
 {
   Standard_Integer i, aNbFaces, j, aNbEdges;
   TopTools_IndexedMapOfShape Faces;
@@ -135,7 +128,7 @@ static
     aNbEdges=Edges.Extent();
     for (j=1; j<=aNbEdges; j++) {
       const TopoDS_Edge& E= TopoDS::Edge(Edges(j));
-      CorrectEdgeTolerance (E, F, aMaxTol);
+      CorrectEdgeTolerance (E, F);
     }
   }
 }
@@ -145,8 +138,7 @@ static
 // purpose :  Correct tolerances for Edge 
 //=======================================================================
 void CorrectEdgeTolerance (const TopoDS_Edge& myShape, 
-                          const TopoDS_Face& S,
-                          const Standard_Real aMaxTol)
+                          const TopoDS_Face& S)
 {
   // 
   // 1. Minimum of conditions to Perform
@@ -280,21 +272,16 @@ void CorrectEdgeTolerance (const TopoDS_Edge& myShape,
        Adaptor3d_CurveOnSurface ACS(GHPC,GAHS);
        ok = Validate(myHCurve->Curve(), ACS, Tol, SameParameter, aNewTol);
        if (ok) {
-         if (cr->IsCurveOnClosedSurface()) {
-           //return ;// BRepCheck::Add(lst,BRepCheck_InvalidCurveOnClosedSurface);
-         }
-         else {
-           //return;//BRepCheck::Add(lst,BRepCheck_InvalidCurveOnSurface);
-         }
-         if (SameParameter) {
-           //return;//BRepCheck::Add(lst,BRepCheck_InvalidSameParameterFlag);
-         }
-         //
+         //modified by NIZNHY-PKV Thu Sep 27 10:28:27 2012f
+         TE->UpdateTolerance(aNewTol+Delta); 
+         CorrectVertexTolerance(myShape);
+         /*
          if (aNewTol<aMaxTol) {
            TE->UpdateTolerance(aNewTol+Delta); 
-           //
            CorrectVertexTolerance(myShape);
-         }
+           //}
+           */
+         //modified by NIZNHY-PKV Thu Sep 27 10:28:44 2012t
        }
 
        if (cr->IsCurveOnClosedSurface()) {
@@ -304,14 +291,16 @@ void CorrectEdgeTolerance (const TopoDS_Edge& myShape,
          ACS.Load(GHPC); // meme remarque...
          ok = Validate(myHCurve->Curve(),ACS,Tol,SameParameter, aNewTol);
          if (ok) {
-           //return;//BRepCheck::Add(lst,BRepCheck_InvalidCurveOnClosedSurface);
-           if (SameParameter) {
-             //return;//BRepCheck::Add(lst,BRepCheck_InvalidSameParameterFlag);
-           }
+           //modified by NIZNHY-PKV Thu Sep 27 10:33:36 2012f
+           TE->UpdateTolerance(aNewTol+Delta);
+           CorrectVertexTolerance(myShape);
+           /*
            if (aNewTol<aMaxTol) {
              TE->UpdateTolerance(aNewTol+Delta);
              CorrectVertexTolerance(myShape);
            } 
+           */
+           //modified by NIZNHY-PKV Thu Sep 27 10:34:00 2012t
          }
        }
       }
@@ -329,7 +318,7 @@ void CorrectEdgeTolerance (const TopoDS_Edge& myShape,
        P = Handle(Geom_Plane)::DownCast(Su);
       }
       if (P.IsNull()) { // not a plane
-       return;//BRepCheck::Add(lst,BRepCheck_NoCurveOnSurface);
+       return;
       }
       
       else {// on fait la projection a la volee, comme BRep_Tool
@@ -355,11 +344,15 @@ void CorrectEdgeTolerance (const TopoDS_Edge& myShape,
        Standard_Boolean okx = Validate(myHCurve->Curve(),ACS,
                                        Tol,Standard_True, aNewTol); // voir dub...
        if (okx) {
-         //return;//BRepCheck::Add(lst,BRepCheck_InvalidCurveOnSurface);
+         //modified by NIZNHY-PKV Thu Sep 27 10:34:10 2012f
+         TE->UpdateTolerance(aNewTol+Delta);
+         CorrectVertexTolerance(myShape);
+         /*
          if (aNewTol<aMaxTol) {
            TE->UpdateTolerance(aNewTol+Delta);
            CorrectVertexTolerance(myShape);
          }
+         */
        }
       }
       
@@ -515,7 +508,7 @@ Standard_Boolean Validate(const Adaptor3d_Curve& CRef,
 // Function : CheckEdge
 // purpose :  Correct tolerances for Vertices on Edge 
 //=======================================================================
-void CheckEdge (const TopoDS_Edge& Ed, const Standard_Real aMaxTol)
+void CheckEdge (const TopoDS_Edge& Ed)
 {
   TopoDS_Edge E=Ed;
   E.Orientation(TopAbs_FORWARD);
@@ -559,8 +552,12 @@ void CheckEdge (const TopoDS_Edge& Ed, const Standard_Real aMaxTol)
              aD2=prep.SquareDistance(Controlp);
              if (aD2 > Tol) {
                aNewTolerance=sqrt(aD2)+dd;
+               //modified by NIZNHY-PKV Thu Sep 27 10:34:41 2012f
+               TV->UpdateTolerance(aNewTolerance);
+               /*
                if (aNewTolerance<aMaxTol)
                  TV->UpdateTolerance(aNewTolerance);
+                 */
              }
            }
            itpr.Next();
@@ -580,8 +577,13 @@ void CheckEdge (const TopoDS_Edge& Ed, const Standard_Real aMaxTol)
            
            if (aD2 > Tol) {
              aNewTolerance=sqrt(aD2)+dd;
+             //modified by NIZNHY-PKV Thu Sep 27 10:34:55 2012f
+             TV->UpdateTolerance(aNewTolerance);
+             /*
              if (aNewTolerance<aMaxTol)
                TV->UpdateTolerance(aNewTolerance);
+               */
+             //modified by NIZNHY-PKV Thu Sep 27 10:35:01 2012t
            }
          }
        }
index 7d107206ac0445f2410eb04d682604ed52d7cdb3..e5f75fe5a5cdc3c8ca6ac7ffb45aa1297a794f5b 100755 (executable)
@@ -269,7 +269,7 @@ BOP_Section::BOP_Section()
       mySectionEdges.Append(aS);
     }
     myResult=aCompound;
-    BOP_CorrectTolerances::CorrectTolerances(myResult, 0.01);
+    BOP_CorrectTolerances::CorrectTolerances(myResult);
     //
     if (!myErrorStatus) {
       FillModified();
index 77510856fafc8aac37a1ee618d53c23ba51ef2e1..a2056ef0ce893f6c25db83bddbd203f18d0482dc 100755 (executable)
@@ -126,7 +126,7 @@ BOP_ShellShell::BOP_ShellShell()
     aRefiner.SetInternals(myInternals);
     aRefiner.Do();
     //
-    BOP_CorrectTolerances::CorrectTolerances(myResult, 0.01);
+    BOP_CorrectTolerances::CorrectTolerances(myResult);
     //
     FillModified();
     myIsDone=Standard_True;
index ac83bb443d03bc7ed2b4a99bf46d911c7c7beef4..f6d7739be5eae26fc4a937bc91d771a4dbf5826e 100755 (executable)
@@ -182,7 +182,7 @@ static Standard_Boolean CheckSameDomainFaceInside(const TopoDS_Face& theFace1,
     aRefiner.Do();
     //
     //
-    BOP_CorrectTolerances::CorrectTolerances(myResult, 0.01);
+    BOP_CorrectTolerances::CorrectTolerances(myResult);
     //
     FillModified();
 
index 86c09b7259b6955d9a0f5a8e36ca3e222e947b20..63657f3b74fa50d57e9cbe33683b97c766cecbdd 100755 (executable)
@@ -204,7 +204,28 @@ static
   //
   // 3. Post-pro the result aShape
   //    and filling the myShapes field .
-  TopExp_Explorer aShellExp(aShape, TopAbs_SHELL);
+  //modified by NIZNHY-PKV Tue Sep 18 12:06:25 2012f
+  Standard_Integer aNbSh; 
+  TopExp_Explorer aShellExp;
+  //
+  aShellExp.Init(aShape, TopAbs_SHELL);
+  for (aNbSh=0; aShellExp.More(); aShellExp.Next(), ++aNbSh) {
+    const TopoDS_Shape& aSh=aShellExp.Current();
+  }
+  //
+  if (aNbSh==1) {
+    Standard_Boolean bIsClosed;
+    //
+    bIsClosed=BRep_Tool::IsClosed(aShell);
+    if (bIsClosed) {
+      myShapes.Append(myFaces);
+      myIsDone=Standard_True;
+      return;
+    }
+  }
+  //modified by NIZNHY-PKV Tue Sep 18 12:06:26 2012t
+  //
+  aShellExp.Init(aShape, TopAbs_SHELL);
   for (; aShellExp.More(); aShellExp.Next()) {
     const TopoDS_Shape& aSh= aShellExp.Current();
 
@@ -221,7 +242,7 @@ static
       myShapes.Append(aLF);
     }
   }
-  
+  //
   myIsDone=Standard_True;
 }
 
index 0298f11462a915df51591f028bc675c7b8bd00d0..bfd59e290636332b91c5b744b8d854620d6008f2 100755 (executable)
@@ -182,7 +182,7 @@ static Standard_Boolean LocalIsKeepTwice(const TopoDS_Face&          aF1,
     aRefiner.SetInternals(myInternals);
     aRefiner.Do();
     //
-    BOP_CorrectTolerances::CorrectTolerances(myResult, 0.01);
+    BOP_CorrectTolerances::CorrectTolerances(myResult);
     //
     FillModified();
 
index 17cc4163a88077098b464cdfb723f0b1fbc25e9d..bba4fcdc083eecf198d038c1326f9cf4946b5f1b 100755 (executable)
@@ -114,7 +114,7 @@ BOP_WireShell::BOP_WireShell()
     //
     BuildResult();
     //
-    BOP_CorrectTolerances::CorrectTolerances(myResult, 0.01);
+    BOP_CorrectTolerances::CorrectTolerances(myResult);
     //
     FillModified();
     myIsDone=Standard_True;
index 3ae677baee0537f67c5e0b121c40428990c4721e..f469028c2c7c46e614c7e7e00b1fa60272b923e7 100755 (executable)
@@ -121,7 +121,7 @@ BOP_WireSolid::BOP_WireSolid()
     //
     BuildResult();
     //
-    BOP_CorrectTolerances::CorrectTolerances(myResult, 0.01);
+    BOP_CorrectTolerances::CorrectTolerances(myResult);
     //
     FillModified();
 
index b49c2412292d2eeff619c9dc87c4a1ee0799564c..2c3b5843fd279084a89ef3061a1ee02cd4359f84 100755 (executable)
@@ -108,7 +108,7 @@ BOP_WireWire::BOP_WireWire()
     //
     BuildResult();
     //
-    BOP_CorrectTolerances::CorrectTolerances(myResult, 0.01);
+    BOP_CorrectTolerances::CorrectTolerances(myResult);
     //
     FillModified();
     myIsDone=Standard_True;
diff --git a/src/BOPTools/BOPTools_PaveFiller_5.cxx b/src/BOPTools/BOPTools_PaveFiller_5.cxx
new file mode 100644 (file)
index 0000000..1619c17
--- /dev/null
@@ -0,0 +1,323 @@
+// Created on: 2001-03-13
+// Created by: Peter KURNEV
+// Copyright (c) 2001-2012 OPEN CASCADE SAS
+//
+// The content of this file is subject to the Open CASCADE Technology Public
+// License Version 6.5 (the "License"). You may not use the content of this file
+// except in compliance with the License. Please obtain a copy of the License
+// at http://www.opencascade.org and read it completely before using this file.
+//
+// The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
+// main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
+//
+// The Original Code and all software distributed under the License is
+// distributed on an "AS IS" basis, without warranty of any kind, and the
+// Initial Developer hereby disclaims all such warranties, including without
+// limitation, any warranties of merchantability, fitness for a particular
+// purpose or non-infringement. Please see the License for the specific terms
+// and conditions governing the rights and limitations under the License.
+
+#include <BOPTools_PaveFiller.ixx>
+
+#include <TColStd_ListOfInteger.hxx>
+#include <TColStd_ListIteratorOfListOfInteger.hxx>
+#include <TColStd_IndexedMapOfInteger.hxx>
+
+#include <gp_Pnt.hxx>
+#include <Geom_Curve.hxx>
+
+#include <TopoDS_Edge.hxx>
+#include <BRep_Builder.hxx>
+
+#include <BooleanOperations_ShapesDataStructure.hxx>
+
+#include <IntTools_Curve.hxx>
+#include <IntTools_Tools.hxx>
+
+#include <BOPTools_Tools.hxx>
+#include <BOPTools_SequenceOfCurves.hxx>
+#include <BOPTools_Curve.hxx>
+#include <BOPTools_ListOfPaveBlock.hxx>
+#include <BOPTools_ListIteratorOfListOfPaveBlock.hxx>
+#include <BOPTools_Pave.hxx>
+#include <BOPTools_ListOfCommonBlock.hxx>
+#include <BOPTools_ListIteratorOfListOfCommonBlock.hxx>
+#include <BOPTools_CommonBlock.hxx>
+
+//modified by NIZNHY-PKV Tue Aug 28 09:45:19 2012ft
+//=======================================================================
+//function : TreatTechnoVertices
+//purpose  : 
+//=======================================================================
+void BOPTools_PaveFiller::TreatTechnoVertices(BOPTools_SSInterference& aFFi) 
+{
+  Standard_Boolean bFlag, bSplitted;
+  Standard_Integer nF1, nF2, aBid, j, aNbCurves, aNbVT, aNbLPB, nE, nVT, iFlag;
+  Standard_Integer nF, nE1, nE2, k;
+  Standard_Real aT;
+  TColStd_IndexedMapOfInteger aMVT;
+  
+  TColStd_ListIteratorOfListOfInteger aItLI;
+  BOPTools_Pave aPave;
+  BOPTools_ListOfPaveBlock aLPB, aLPBS;
+  BOPTools_ListIteratorOfListOfPaveBlock aItLPB, aItLPB1;
+  //
+  nF1=aFFi.Index1();
+  nF2=aFFi.Index2();
+  BOPTools_SequenceOfCurves& aBCs=aFFi.Curves();
+  //
+  aNbCurves=aBCs.Length();
+  for (j=1; j<=aNbCurves; j++) {
+    BOPTools_Curve& aBC=aBCs(j);
+    //Handle(Geom_Curve) aC3D= aBC.Curve().Curve(); //DEB
+    TColStd_ListOfInteger& aLVT=aBC.TechnoVertices();
+    aItLI.Initialize(aLVT);
+    for (; aItLI.More(); aItLI.Next()) {
+      nVT=aItLI.Value();
+      aMVT.Add(nVT);
+    }
+  }  
+  //
+  aNbVT=aMVT.Extent();
+  if (!aNbVT) {// nothing to do
+    return; 
+  }
+  //------------------------------
+  //
+  aBid=0;
+  SplitsInFace (aBid, nF1, nF2, aLPB);
+  SplitsInFace (aBid, nF2, nF1, aLPB);
+  SplitsOnFace (aBid, nF1, nF2, aLPB);
+  //
+  aNbLPB=aLPB.Extent();
+  if (!aNbLPB) {// nothing to do 
+    return; 
+  }
+  //
+  for (k=1; k<=aNbVT; ++k) {
+    nVT=aMVT(k);
+    const TopoDS_Vertex& aV=*((TopoDS_Vertex*)&(myDS->Shape(nVT)));
+    //
+    // 1.Collect Pave Blocks (pretenders) to split by nVT => aLPBS
+    aLPBS.Clear();
+    aItLPB.Initialize(aLPB);
+    for (; aItLPB.More(); aItLPB.Next()) {
+      const BOPTools_PaveBlock& aPB=aItLPB.Value();
+      nE=aPB.OriginalEdge();
+      const TopoDS_Edge& aE=*((TopoDS_Edge*)&(myDS->Shape(nE)));
+      //
+      iFlag=myContext->ComputeVE(aV, aE, aT);
+      if (iFlag) {
+       continue;
+      }
+      // 
+      aPave.SetIndex(nVT);
+      aPave.SetParam(aT);
+      //
+      BOPTools_ListOfPaveBlock& aLPBE=mySplitShapesPool(myDS->RefEdge(nE)); 
+      aItLPB1.Initialize(aLPBE);
+      for (; aItLPB1.More(); aItLPB1.Next()) {
+       const BOPTools_PaveBlock& aPBE=aItLPB1.Value();
+       if (aPBE.IsInBlock(aPave)) {
+         aLPBS.Append(aPBE);
+       }
+      }
+    }//for (; aItLPB.More(); aItLPB.Next()) {
+    //
+    // 2.Split Pave Blocks [aLPBS] by the vertex [nVT]
+    BOPTools_ListIteratorOfListOfCommonBlock aItCB1, aItCB2;
+    BOPTools_PaveBlock aPB11, aPB12, aPB21, aPB22, aPB1, aPB2;
+    //
+    aItLPB.Initialize(aLPBS);
+    for (; aItLPB.More(); aItLPB.Next()) { 
+      const BOPTools_PaveBlock& aPBS=aItLPB.Value();
+      nE=aPBS.OriginalEdge();
+      //
+      BOPTools_ListOfCommonBlock& aLCB1=myCommonBlockPool(myDS->RefEdge(nE));
+      aItCB1.Initialize(aLCB1);
+      for (; aItCB1.More(); aItCB1.Next()) {
+       BOPTools_CommonBlock& aCB1=aItCB1.Value();
+       aPB1=aCB1.PaveBlock1(nE);
+       nE1=aPB1.OriginalEdge();
+       //
+       if (aPB1.IsEqual(aPBS)) {
+         //
+         SplitPaveBlock(aPB1, nVT, aPB11, aPB12);
+         //
+         nF=aCB1.Face();
+         if (nF) {
+           BOPTools_CommonBlock aCBa, aCBb;
+           //
+           aLCB1.Remove(aItCB1);
+           //
+           aCBa.SetPaveBlock1(aPB11);
+           aCBa.SetFace(nF);
+           aCBb.SetPaveBlock2(aPB12);
+           aCBb.SetFace(nF);
+           //
+           aLCB1.Append(aCBa);
+           aLCB1.Append(aCBb);
+           //
+           break; 
+         }// if (nF) { 
+         else { // 1
+           BOPTools_CommonBlock aCBa, aCBb;
+           //
+           aPB2=aCB1.PaveBlock2(nE);
+           nE2=aPB2.OriginalEdge();
+           //
+           SplitPaveBlock(aPB2, nVT, aPB21, aPB22);
+           //
+           //aLCB1.Remove(aItCB1);
+           //
+           iFlag=0;
+           BOPTools_ListOfCommonBlock& aLCB2=myCommonBlockPool(myDS->RefEdge(nE2));
+           aItCB2.Initialize(aLCB2);
+           for (; aItCB2.More(); aItCB2.Next()) {
+             BOPTools_CommonBlock& aCB2=aItCB2.Value();
+             BOPTools_PaveBlock& aPBx=aCB2.PaveBlock1(nE2);
+             if (aPBx.IsEqual(aPB2)) {
+               aLCB2.Remove(aItCB2);
+               aLCB1.Remove(aItCB1);
+               //
+               bFlag=CheckCoincidence(aPB11, aPB21);
+               if (bFlag) {
+                 aCBa.SetPaveBlock1(aPB11);
+                 aCBa.SetPaveBlock2(aPB21);
+                 aCBb.SetPaveBlock1(aPB12);
+                 aCBb.SetPaveBlock2(aPB22);
+               }
+               else {
+                 aCBa.SetPaveBlock1(aPB11);
+                 aCBa.SetPaveBlock2(aPB22);
+                 aCBb.SetPaveBlock1(aPB12);
+                 aCBb.SetPaveBlock2(aPB21);
+               }
+               //
+               aLCB1.Append(aCBa);
+               aLCB1.Append(aCBb);
+               aLCB2.Append(aCBa);
+               aLCB2.Append(aCBb);
+               //
+               iFlag=1;
+               break;
+             }//if (aPB1.IsEqual(aPB2)) {
+           }//for (; aItCB2.More(); aItCB2.Next()) {
+         }//else { // 1
+       }//if (aPB1.IsEqual(aPBS)) {
+       if (iFlag) {
+         break;
+       }
+      }//for (; aItCB.More(); aItCB.Next()) {
+    }//for (; aItLPB.More(); aItLPB.Next()) {
+  }//for (k=1; k<=aNbVT; ++k) {
+}
+//=======================================================================
+//function : SplitPaveBlock
+//purpose  : 
+//=======================================================================
+void BOPTools_PaveFiller::SplitPaveBlock(const BOPTools_PaveBlock& aPBE,
+                                        const Standard_Integer nVT,
+                                        BOPTools_PaveBlock& aPB1,
+                                        BOPTools_PaveBlock& aPB2)
+{
+  Standard_Integer nE, iFlag;
+  Standard_Real aT;
+  BOPTools_Pave aPave;
+  BOPTools_ListIteratorOfListOfPaveBlock aItLPB;
+  //
+  const TopoDS_Vertex& aVT=*((TopoDS_Vertex*)&(myDS->Shape(nVT)));
+  //
+  nE=aPBE.OriginalEdge();
+  const TopoDS_Edge& aE=*((TopoDS_Edge*)&(myDS->Shape(nE)));
+  //
+  BOPTools_ListOfPaveBlock& aLPB=mySplitShapesPool(myDS->RefEdge(nE)); 
+  //
+  aItLPB.Initialize(aLPB);
+  for (; aItLPB.More(); aItLPB.Next()) {
+    const BOPTools_PaveBlock& aPB=aItLPB.Value();
+    if (aPB.IsEqual(aPBE)) {
+      aLPB.Remove(aItLPB);
+      break;
+    }
+  }
+  //
+  iFlag=myContext->ComputeVE(aVT, aE, aT);
+  //
+  aPave.SetIndex(nVT);
+  aPave.SetParam(aT);
+  //
+  aPB1.SetOriginalEdge(nE);
+  aPB1.SetPave1(aPBE.Pave1());
+  aPB1.SetPave2(aPave);
+  //
+  aPB2.SetOriginalEdge(nE);
+  aPB2.SetPave1(aPave);
+  aPB2.SetPave2(aPBE.Pave2());
+  //
+  aLPB.Append(aPB1);
+  aLPB.Append(aPB2);
+}
+
+//=======================================================================
+//function : CheckCoincidence
+//purpose  : 
+//=======================================================================
+Standard_Boolean 
+  BOPTools_PaveFiller::CheckCoincidence(const BOPTools_PaveBlock& aPB1,
+                                       const BOPTools_PaveBlock& aPB2)
+                                       
+{
+  Standard_Boolean bRet;
+  Standard_Integer nV11, nV12, nV21, nV22, nE1, nE2, iFlag;
+  Standard_Real aT11, aT12, aT21, aT22, aTM, aTN, aTolE1;
+  gp_Pnt aPM;
+  TopoDS_Vertex aVM;
+  BRep_Builder aBB;
+  //
+  const BOPTools_Pave& aPave11=aPB1.Pave1();
+  nV11=aPave11.Index();
+  aT11=aPave11.Param();
+  // 
+  const BOPTools_Pave& aPave12=aPB1.Pave2();
+  aT12=aPave12.Param();
+  nV12=aPave12.Index();
+  //
+  const BOPTools_Pave& aPave21=aPB2.Pave1();
+  nV21=aPave21.Index();
+  aT21=aPave21.Param();
+  //
+  const BOPTools_Pave& aPave22=aPB2.Pave2();
+  nV22=aPave22.Index();
+  aT22=aPave22.Param();
+  //
+  bRet=((nV11==nV21 && nV12==nV22) || (nV11==nV22 && nV12==nV21));
+  if (!bRet) {
+    return bRet;
+  }
+  //
+  nE1=aPB1.OriginalEdge();
+  const TopoDS_Edge& aE1=*((TopoDS_Edge*)&(myDS->Shape(nE1)));
+  aTolE1=BRep_Tool::Tolerance(aE1);
+  //
+  nE2=aPB2.OriginalEdge();
+  const TopoDS_Edge& aE2=*((TopoDS_Edge*)&(myDS->Shape(nE2)));
+  // 
+  aTM=IntTools_Tools::IntermediatePoint (aT11, aT12);
+  BOPTools_Tools::PointOnEdge(aE1, aTM, aPM);
+  //
+  aBB.MakeVertex (aVM, aPM, aTolE1);
+  //
+  iFlag=myContext->ComputeVE(aVM, aE2, aTN); 
+  if (iFlag) {
+    bRet=!bRet; //False
+  }
+  //
+  if (aT21 <aT22) {
+    bRet=(aTN>aT21 && aTN<aT22);
+  }
+  else {
+    bRet=(aTN>aT22 && aTN<aT21);
+  }
+  return bRet;
+}