]> SALOME platform Git repositories - modules/geom.git/commitdiff
Salome HOME
Mantis issue 0020853: EDF 1394 GEOM: Partition fails between 2 faces. A patch by...
authorjfa <jfa@opencascade.com>
Thu, 17 Jun 2010 07:19:16 +0000 (07:19 +0000)
committerjfa <jfa@opencascade.com>
Thu, 17 Jun 2010 07:19:16 +0000 (07:19 +0000)
src/NMTTools/NMTTools_PaveFiller_4.cxx

index e23ee2202248aeb6c524da3473e2187f0b8f4855..b6dc1b48516e005a4068ccd585152cbc71ef9c2b 100644 (file)
@@ -1,4 +1,4 @@
-//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
+//  Copyright (C) 2007-2008  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:        NMTTools_PaveFiller_4.cxx
+//  Created:     Mon Dec  8 17:08:58 2003
+//  Author:      Peter KURNEV
 
-// File:        NMTTools_PaveFiller_4.cxx
-// Created:     Mon Dec  8 17:08:58 2003
-// Author:      Peter KURNEV
-//              <pkv@irinox>
-//
 #include <NMTTools_PaveFiller.ixx>
-//
+
 #include <stdio.h>
 #include <Precision.hxx>
 
@@ -99,7 +97,6 @@
 #include <NMTTools_CommonBlock.hxx>
 #include <NMTTools_ListIteratorOfListOfCommonBlock.hxx>
 
-
 #include <TColStd_ListOfInteger.hxx>
 #include <TColStd_ListIteratorOfListOfInteger.hxx>
 #include <BRepBndLib.hxx>
 #include <TColStd_MapOfInteger.hxx>
 #include <TColStd_MapIteratorOfMapOfInteger.hxx>
 
-
 static
   void TreatNewVertices(const BooleanOperations_IndexedDataMapOfShapeInteger& aMapVI,
                         TopTools_DataMapOfShapeListOfShape& myImages,
                         TopTools_DataMapOfShapeShape& myOrigins);
 
 static
-  void MakeNewVertex(const TopTools_ListOfShape& aLV, 
+  void MakeNewVertex(const TopTools_ListOfShape& aLV,
                      TopoDS_Vertex& aNewVertex);
 
-
-static 
+static
   void VertexParameters(const IntTools_CommonPrt& aCPart,
-                        Standard_Real& aT1, 
+                        Standard_Real& aT1,
                         Standard_Real& aT2);
+
 static
   Standard_Boolean IsOnPave(const Standard_Real& aT1,
                             const IntTools_Range& aRange,
                             const Standard_Real& aTolerance);
+
 static
   void EECommonBlocks(const BOPTools_IDMapOfPaveBlockIMapOfPaveBlock& aMapCB);
 
@@ -135,15 +132,16 @@ static
                     const BOPTools_IDMapOfPaveBlockIMapOfPaveBlock& aMapCB,
                     BOPTools_IMapOfPaveBlock& aProcessedBlocks,
                     BOPTools_IMapOfPaveBlock& aChain);
+
 static
   void FindChains(const BOPTools_IDMapOfPaveBlockIMapOfPaveBlock& aMapCB,
                   NMTTools_ListOfCommonBlock& aLCB);
 
 //=======================================================================
 // function: PerformEE
-// purpose: 
+// purpose:
 //=======================================================================
-  void NMTTools_PaveFiller::PerformEE() 
+void NMTTools_PaveFiller::PerformEE()
 {
   myIsDone=Standard_False;
   //
@@ -153,7 +151,7 @@ static
   Standard_Integer aNbLPB1, aNbLPB2;
   Standard_Real aTolE1, aTolE2, aDeflection=0.01;
   BOPTools_ListIteratorOfListOfPaveBlock anIt1, anIt2;
-  TopoDS_Edge aEWhat, aEWith; 
+  TopoDS_Edge aEWhat, aEWith;
   TopoDS_Vertex aNewVertex;
   BooleanOperations_IndexedDataMapOfShapeInteger aMapVI;
   BOPTools_IDMapOfPaveBlockIMapOfPaveBlock aMapCB;
@@ -177,8 +175,8 @@ static
     //  continue;
     //}
     //
-    nE1=n1; 
-    nE2=n2; 
+    nE1=n1;
+    nE2=n2;
     //
     if(bJustAdd) {
       //myIntrPool->AddInterference (nE1, nE2, BooleanOperations_EdgeEdge, anIndexIn);
@@ -187,7 +185,6 @@ static
     //
     const TopoDS_Edge aE1=TopoDS::Edge(myDS->Shape(nE1));//mpv
     const TopoDS_Edge aE2=TopoDS::Edge(myDS->Shape(nE2));//mpv
-    
     //
     if (BRep_Tool::Degenerated(aE1) || BRep_Tool::Degenerated(aE2)){
       continue;
@@ -199,12 +196,12 @@ static
     BOPTools_ListOfPaveBlock& aLPB1=mySplitShapesPool(myDS->RefEdge(nE1));
     BOPTools_ListOfPaveBlock& aLPB2=mySplitShapesPool(myDS->RefEdge(nE2));
     //
-    // Modified  Thu Sep 14 14:35:18 2006 
+    // Modified  Thu Sep 14 14:35:18 2006
     // Contribution of Samtech www.samcef.com BEGIN
     aNbLPB1=aLPB1.Extent();
     aNbLPB2=aLPB2.Extent();
-    
-    //if (aE1.IsSame(aE2) && aNbLPB1==1 && aNbLPB2==1) { 
+    //
+    //if (aE1.IsSame(aE2) && aNbLPB1==1 && aNbLPB2==1) {
     //  continue;
     //}
     // Contribution of Samtech www.samcef.com END
@@ -219,14 +216,14 @@ static
       for (anIt2.Initialize(aLPB2); anIt2.More(); anIt2.Next()) {
         BOPTools_PaveBlock& aPB2=anIt2.Value();
         const IntTools_ShrunkRange& aShrunkRange2=aPB2.ShrunkRange();
-      
+        //
         const IntTools_Range& aSR2=aShrunkRange2.ShrunkRange();
         const Bnd_Box&        aBB2=aShrunkRange2.BndBox();
         //
         if (aBB1.IsOut (aBB2)) {
           continue;
         }
-        // 
+        //
         // EE
         IntTools_EdgeEdge aEE;
         aEE.SetEdge1 (aE1);
@@ -244,7 +241,7 @@ static
         //
         aEE.SetRange1(anewSR1);
         aEE.SetRange2(anewSR2);
-          
+        //
         aEE.Perform();
         //
         anIndexIn=0;
@@ -279,11 +276,14 @@ static
                 IntTools_Range aR1, aR2;
                 //
                 VertexParameters(aCPart, aT1, aT2);
-                // 
+                //
                 //decide to keep the pave or not
                 aR1 = (aEE.Order()) ? anewSR2 : anewSR1;
                 aR2 = (aEE.Order()) ? anewSR1 : anewSR2;
                 //
+                //modified by NIZNHY-PKV Mon Jun 07 11:01:40 2010f
+                aTol=0.8*aTol;
+                //modified by NIZNHY-PKV Mon Jun 07 11:01:43 2010t
                 bIsOnPave1=IsOnPave(aT1, aR1, aTol);
                 bIsOnPave2=IsOnPave(aT2, aR2, aTol);
                 //
@@ -353,7 +353,7 @@ static
                 aMapVI.Add(aNewVertex, anIndexIn);
               }
                 break;
-                
+
               case TopAbs_EDGE: {
                 Standard_Integer aNbComPrt2;
                 Standard_Boolean aCoinsideFlag;
@@ -369,25 +369,25 @@ static
                 // Fill aMapCB
                 if (aMapCB.Contains(aPB1)) {
                   BOPTools_IMapOfPaveBlock& aMapPB=aMapCB.ChangeFromKey(aPB1);
-                  aMapPB.Add(aPB1); 
-                  aMapPB.Add(aPB2); 
+                  aMapPB.Add(aPB1);
+                  aMapPB.Add(aPB2);
                 }
                 else {
                   BOPTools_IMapOfPaveBlock aMapPB;
-                  aMapPB.Add(aPB1); 
-                  aMapPB.Add(aPB2); 
+                  aMapPB.Add(aPB1);
+                  aMapPB.Add(aPB2);
                   aMapCB.Add(aPB1, aMapPB);
                 }
                 //
                 if (aMapCB.Contains(aPB2)) {
                   BOPTools_IMapOfPaveBlock& aMapPB=aMapCB.ChangeFromKey(aPB2);
-                  aMapPB.Add(aPB1); 
-                  aMapPB.Add(aPB2); 
+                  aMapPB.Add(aPB1);
+                  aMapPB.Add(aPB2);
                 }
                 else {
                   BOPTools_IMapOfPaveBlock aMapPB;
-                  aMapPB.Add(aPB1); 
-                  aMapPB.Add(aPB2); 
+                  aMapPB.Add(aPB1);
+                  aMapPB.Add(aPB2);
                   aMapCB.Add(aPB2, aMapPB);
                 }
                 // qqf
@@ -399,18 +399,13 @@ static
                 break;
             default:
               break;
-            } // switch (aType) 
-          } // for (i=1; i<=aNbCPrts; i++) 
+            } // switch (aType)
+          } // for (i=1; i<=aNbCPrts; i++)
         }// if (aEE.IsDone())
-      } // for (; anIt2.More(); anIt2.Next()) 
-    } // for (; anIt1.More(); anIt1.Next()) 
-  }// for (; myDSIt.More(); myDSIt.Next()) 
-  //
-  //modified by NIZNHY-PKV Thu Mar 19 14:13:34 2009f
+      } // for (; anIt2.More(); anIt2.Next())
+    } // for (; anIt1.More(); anIt1.Next())
+  }// for (; myDSIt.More(); myDSIt.Next())
   //
-  //EENewVertices (aMapVI);
-  //EECommonBlocks(aMapCB);
-  
   {
     NMTTools_ListOfCommonBlock aLCB;
     //
@@ -420,18 +415,17 @@ static
     TreatPaveBlocks(aLCB);
     ReplaceCommonBlocks(aLCB);
   }
-  //modified by NIZNHY-PKV Thu Mar 19 14:13:42 2009t
   //
   PerformVF1();
   //
   myIsDone=Standard_True;
 }
-//modified by NIZNHY-PKV Thu Mar 19 14:13:52 2009f
+
 //=======================================================================
 // function:TreatPaveBlocks
-// purpose: 
+// purpose:
 //=======================================================================
-  void NMTTools_PaveFiller::TreatPaveBlocks (NMTTools_ListOfCommonBlock& theLCB)
+void NMTTools_PaveFiller::TreatPaveBlocks (NMTTools_ListOfCommonBlock& theLCB)
 {
   Standard_Boolean bFound;
   Standard_Integer nE, nV, nVp, iFlag;
@@ -506,27 +500,28 @@ static
     }//for (; anItLPB.More(); anItLPB.Next()) {
   }
 }
-//modified by NIZNHY-PKV Thu Mar 19 14:14:13 2009t
+
 //=======================================================================
 // function:EECommonBlocks
-// purpose: 
+// purpose:
 //=======================================================================
-  void NMTTools_PaveFiller::EECommonBlocks(const BOPTools_IDMapOfPaveBlockIMapOfPaveBlock& aMapCB)
+void NMTTools_PaveFiller::EECommonBlocks(const BOPTools_IDMapOfPaveBlockIMapOfPaveBlock& aMapCB)
 {
   NMTTools_ListOfCommonBlock aLCB;
   //
   FindChains(aMapCB, aLCB);
   ReplaceCommonBlocks(aLCB);
 }
+
 //=======================================================================
 // function:EENewVertices
-// purpose: 
+// purpose:
 //=======================================================================
-  void NMTTools_PaveFiller::EENewVertices (const BooleanOperations_IndexedDataMapOfShapeInteger& aMapVI) 
+void NMTTools_PaveFiller::EENewVertices (const BooleanOperations_IndexedDataMapOfShapeInteger& aMapVI)
 {
   Standard_Integer aNb, aNbVSD, nVnew, nIEE, nE[2], j, iFlag;
   Standard_Real aT;
-  TopoDS_Edge aE; 
+  TopoDS_Edge aE;
   TopTools_DataMapOfShapeListOfShape myImages;
   TopTools_DataMapOfShapeShape myOrigins;
   TopTools_DataMapIteratorOfDataMapOfShapeListOfShape aItIm;
@@ -538,11 +533,11 @@ static
   BOPTools_CArray1OfEEInterference& aEEs=myIP->EEInterferences();
   //
   aNb=aMapVI.Extent();
-  if (!aNb) { // no new vertices, no new problems 
+  if (!aNb) { // no new vertices, no new problems
     return;
   }
   //
-  // 0. 
+  // 0.
   if (aNb==1) {
     TopoDS_Vertex aV1=TopoDS::Vertex(aMapVI.FindKey(1));
     EENewVertices(aV1, aMapVI);
@@ -600,11 +595,11 @@ static
 // completely rewritten
 //=======================================================================
 //function : TreatNewVertices
-//purpose  : 
+//purpose  :
 //=======================================================================
 void TreatNewVertices(const BooleanOperations_IndexedDataMapOfShapeInteger& aMapVI,
-                   TopTools_DataMapOfShapeListOfShape& myImages,
-                   TopTools_DataMapOfShapeShape& myOrigins)
+                      TopTools_DataMapOfShapeListOfShape& myImages,
+                      TopTools_DataMapOfShapeShape& myOrigins)
 {
   Standard_Integer j, i, aNbV, aNbVSD;
   Standard_Real aTol;
@@ -636,13 +631,13 @@ void TreatNewVertices(const BooleanOperations_IndexedDataMapOfShapeInteger& aMap
     Bnd_Box aBox;
     //
     aTol=BRep_Tool::Tolerance(TopoDS::Vertex(aV));
-    aBox.SetGap(aTol); 
+    aBox.SetGap(aTol);
     BRepBndLib::Add(aV, aBox);
     //
     aTreeFiller.Add(i, aBox);
     //
     aMIS.Add(i, aV);
-    aMSB.Add(aV, aBox); 
+    aMSB.Add(aV, aBox);
   }
   //
   aTreeFiller.Fill();
@@ -678,7 +673,7 @@ void TreatNewVertices(const BooleanOperations_IndexedDataMapOfShapeInteger& aMap
         //
         aNbVSD=aBBTree.Select(aSelector);
         if (!aNbVSD) {
-          continue;  // it must not be 
+          continue;  // it must not be
         }
         //
         const TColStd_ListOfInteger& aLI=aSelector.Indices();
@@ -775,12 +770,12 @@ void TreatNewVertices(const BooleanOperations_IndexedDataMapOfShapeInteger& aMap
     }
   }
 }
-//
+
 //=======================================================================
 //function : MakeNewVertex
-//purpose  : 
+//purpose  :
 //=======================================================================
-void MakeNewVertex(const TopTools_ListOfShape& aLV, 
+void MakeNewVertex(const TopTools_ListOfShape& aLV,
                    TopoDS_Vertex& aNewVertex)
 {
   Standard_Integer aNbV;
@@ -822,16 +817,17 @@ void MakeNewVertex(const TopTools_ListOfShape& aLV,
   //
   aBB.MakeVertex (aNewVertex, aPGC, aDmax);
 }
+
 //=======================================================================
 // function:EENewVertices
-// purpose: 
+// purpose:
 //=======================================================================
-  void NMTTools_PaveFiller::EENewVertices (const TopoDS_Vertex& aNewVertex,
-                                           const BooleanOperations_IndexedDataMapOfShapeInteger& aMapVI) 
+void NMTTools_PaveFiller::EENewVertices (const TopoDS_Vertex& aNewVertex,
+                                         const BooleanOperations_IndexedDataMapOfShapeInteger& aMapVI)
 {
   Standard_Integer  i, aNewShape, nE1, nE2;
   Standard_Real  aT1, aT2;
-  BooleanOperations_AncestorsSeqAndSuccessorsSeq anASSeq;       
+  BooleanOperations_AncestorsSeqAndSuccessorsSeq anASSeq;
   BOPTools_Pave aPave;
   //
   BOPTools_CArray1OfEEInterference& aEEs=myIP->EEInterferences();
@@ -864,11 +860,12 @@ void MakeNewVertex(const TopTools_ListOfShape& aLV,
   BOPTools_PaveSet& aPaveSet2=myPavePoolNew(myDS->RefEdge(nE2));
   aPaveSet2.Append(aPave);
 }
+
 //=======================================================================
 // function: RefinePavePool
-// purpose: 
+// purpose:
 //=======================================================================
-  void NMTTools_PaveFiller::RefinePavePool()
+void NMTTools_PaveFiller::RefinePavePool()
 {
   Standard_Integer  i, aNbNew;
 
@@ -897,19 +894,20 @@ void MakeNewVertex(const TopTools_ListOfShape& aLV,
     }
   }
 }
+
 //=======================================================================
 // function: PreparePaveBlocks
-// purpose: 
+// purpose:
 //=======================================================================
-  void NMTTools_PaveFiller::PreparePaveBlocks(const TopAbs_ShapeEnum aType1, 
-                                              const TopAbs_ShapeEnum aType2)
+void NMTTools_PaveFiller::PreparePaveBlocks(const TopAbs_ShapeEnum aType1,
+                                            const TopAbs_ShapeEnum aType2)
 {
   myIsDone=Standard_False;
   //
   Standard_Boolean bOk1, bOk2, bOk3, bFlag;
   Standard_Integer i, aNb, nE[2], n1, n2, aNbSplits;
   TColStd_MapOfInteger aMap;
-  
+  //
   bOk1= (aType1==TopAbs_VERTEX) &&  (aType2==TopAbs_EDGE) ;
   bOk2= (aType1==TopAbs_EDGE)   &&  (aType2==TopAbs_EDGE) ;
   bOk3= (aType1==TopAbs_EDGE)   &&  (aType2==TopAbs_FACE) ;
@@ -923,10 +921,10 @@ void MakeNewVertex(const TopTools_ListOfShape& aLV,
   for (; myDSIt->More(); myDSIt->Next()) {
     myDSIt->Current(n1, n2, bFlag);
     //
-    nE[0]=n1; 
-    nE[1]=n2; 
+    nE[0]=n1;
+    nE[1]=n2;
     if (myDS->GetShapeType(n1)!=TopAbs_EDGE) {
-      nE[0]=n2; 
+      nE[0]=n2;
       nE[1]=n1;
     }
     //
@@ -934,7 +932,7 @@ void MakeNewVertex(const TopTools_ListOfShape& aLV,
       BOPTools_ListOfPaveBlock& aLPB=mySplitShapesPool(myDS->RefEdge(nE[i]));
       aNbSplits=aLPB.Extent();
       if (!aNbSplits) {
-        if (aMap.Add(nE[i])) { 
+        if (aMap.Add(nE[i])) {
           PreparePaveBlocks(nE[i]);
           if (!myIsDone) {
             return;
@@ -942,14 +940,15 @@ void MakeNewVertex(const TopTools_ListOfShape& aLV,
         }
       }
     }
-  }// for (; myDSIt.More(); myDSIt.Next()) 
+  }// for (; myDSIt.More(); myDSIt.Next())
   myIsDone=Standard_True;
 }
+
 //=======================================================================
 // function: PreparePaveBlocks
-// purpose: 
+// purpose:
 //=======================================================================
-  void NMTTools_PaveFiller::PreparePaveBlocks(const Standard_Integer nE)
+void NMTTools_PaveFiller::PreparePaveBlocks(const Standard_Integer nE)
 {
   myIsDone=Standard_False;
   //
@@ -959,7 +958,7 @@ void MakeNewVertex(const TopTools_ListOfShape& aLV,
   TopoDS_Vertex aV1, aV2;
   //
   BOPTools_ListOfPaveBlock& aLPB=mySplitShapesPool(myDS->RefEdge(nE));
-  // Edge 
+  // Edge
   aE=TopoDS::Edge(myDS->Shape(nE));
   if (BRep_Tool::Degenerated(aE)) {
     myIsDone=Standard_True;
@@ -967,7 +966,7 @@ void MakeNewVertex(const TopTools_ListOfShape& aLV,
   }
   //
   BOPTools_PaveSet& aPS=myPavePool(myDS->RefEdge(nE));
-  
+  //
   BOPTools_PaveBlockIterator aPBIt(nE, aPS);
   for (; aPBIt.More(); aPBIt.Next()) {
     BOPTools_PaveBlock& aPB=aPBIt.Value();
@@ -988,7 +987,7 @@ void MakeNewVertex(const TopTools_ListOfShape& aLV,
       sprintf (buf, "Can not obtain ShrunkRange for Edge %d\n", nE);
       BOPTColStd_Dump::PrintMessage(buf);
       sprintf (buf, "Can not obtain ShrunkRange for Edge %d", nE);
-      throw 
+      throw
         BOPTColStd_Failure(buf) ;
     }
     //
@@ -1005,16 +1004,17 @@ void MakeNewVertex(const TopTools_ListOfShape& aLV,
     //
     aPB.SetShrunkRange(aSR);
     aLPB.Append(aPB);
-  } //for (; aPBIt.More(); aPBIt.Next()) 
+  } //for (; aPBIt.More(); aPBIt.Next())
   myIsDone=Standard_True;
 }
+
 //=======================================================================
 // function: CorrectShrunkRanges
-// purpose: 
+// purpose:
 //=======================================================================
-  void NMTTools_PaveFiller::CorrectShrunkRanges(const Standard_Integer aSide,
-                                                const BOPTools_Pave& aPave,
-                                                IntTools_ShrunkRange& aShrunkRange)
+void NMTTools_PaveFiller::CorrectShrunkRanges(const Standard_Integer aSide,
+                                              const BOPTools_Pave& aPave,
+                                              IntTools_ShrunkRange& aShrunkRange)
 {
   BooleanOperations_KindOfInterference aType;
   Standard_Integer anIndexInterf ;
@@ -1039,7 +1039,7 @@ void MakeNewVertex(const TopTools_ListOfShape& aLV,
 
   const IntTools_Range& aSR=aShrunkRange.ShrunkRange();
   const TopoDS_Edge& aE=aShrunkRange.Edge();
+
   IntTools_Range aNewRange;
   IntTools_Range aCPRange;
 
@@ -1079,13 +1079,13 @@ void MakeNewVertex(const TopTools_ListOfShape& aLV,
     }
   }
 }
+
 //=======================================================================
 // function:  IsBlocksCoinside
-// purpose: 
+// purpose:
 //=======================================================================
-  Standard_Boolean 
-    NMTTools_PaveFiller::IsBlocksCoinside(const BOPTools_PaveBlock& aPB1,
-                                          const BOPTools_PaveBlock& aPB2) const
+Standard_Boolean NMTTools_PaveFiller::IsBlocksCoinside(const BOPTools_PaveBlock& aPB1,
+                                                       const BOPTools_PaveBlock& aPB2) const
 {
   Standard_Boolean bRetFlag=Standard_True;
   Standard_Real aTolV11, aTolV12, aTolV21, aTolV22;
@@ -1101,7 +1101,7 @@ void MakeNewVertex(const TopTools_ListOfShape& aLV,
   aTolV12=BRep_Tool::Tolerance(aV12);
   aTolV21=BRep_Tool::Tolerance(aV21);
   aTolV22=BRep_Tool::Tolerance(aV22);
-  
+
   aP11=BRep_Tool::Pnt(aV11);
   aP12=BRep_Tool::Pnt(aV12);
   aP21=BRep_Tool::Pnt(aV21);
@@ -1128,20 +1128,22 @@ void MakeNewVertex(const TopTools_ListOfShape& aLV,
   }
   return !bRetFlag;
 }
+
 //=======================================================================
 // function: ReplaceCommonBlocks
-// purpose: 
+// purpose:
 //=======================================================================
-  void NMTTools_PaveFiller::ReplaceCommonBlocks(const NMTTools_ListOfCommonBlock& aLCB)
+void NMTTools_PaveFiller::ReplaceCommonBlocks(const NMTTools_ListOfCommonBlock& aLCB)
 {
   RemoveCommonBlocks(aLCB);
   SplitCommonBlocks(aLCB);
 }
+
 //=======================================================================
 // function: SplitCommonBlocks
-// purpose: 
+// purpose:
 //=======================================================================
-  void NMTTools_PaveFiller::SplitCommonBlocks(const NMTTools_ListOfCommonBlock& aLCB)
+void NMTTools_PaveFiller::SplitCommonBlocks(const NMTTools_ListOfCommonBlock& aLCB)
 {
   Standard_Integer nE;
   NMTTools_ListOfCommonBlock aLCBx;
@@ -1171,10 +1173,10 @@ void MakeNewVertex(const TopTools_ListOfShape& aLV,
       }
     }
   }
-  // Modified to provide the order of edges 
-  // in common block where the edge with max 
+  // Modified to provide the order of edges
+  // in common block where the edge with max
   // tolerance value will be the first
-  //  Thu Sep 14 14:35:18 2006 
+  //  Thu Sep 14 14:35:18 2006
   // Contribution of Samtech www.samcef.com BEGIN
   Standard_Integer i, iMax, aNb, aNbCB, nSp;
   Standard_Real aTolSp, aTolMax;
@@ -1231,11 +1233,12 @@ void MakeNewVertex(const TopTools_ListOfShape& aLV,
   }//for (nE=1; nE<=aNb; ++nE) {
   // Contribution of Samtech www.samcef.com END
 }
+
 //=======================================================================
 // function: RemoveCommonBlocks
-// purpose: 
+// purpose:
 //=======================================================================
-  void NMTTools_PaveFiller::RemoveCommonBlocks(const NMTTools_ListOfCommonBlock& aLCB)
+void NMTTools_PaveFiller::RemoveCommonBlocks(const NMTTools_ListOfCommonBlock& aLCB)
 {
   Standard_Integer nE;
   NMTTools_ListOfCommonBlock aLCBx;
@@ -1247,7 +1250,7 @@ void MakeNewVertex(const TopTools_ListOfShape& aLV,
     const NMTTools_CommonBlock& aCB=anItCB.Value();
     const BOPTools_ListOfPaveBlock& aLPB=aCB.PaveBlocks();
     //
-    // Remove aCB from each edge 
+    // Remove aCB from each edge
     anItLPB.Initialize(aLPB);
     for (; anItLPB.More(); anItLPB.Next()) {
       const BOPTools_PaveBlock& aPB=anItLPB.Value();
@@ -1265,24 +1268,24 @@ void MakeNewVertex(const TopTools_ListOfShape& aLV,
     }
   }
 }
+
 //=======================================================================
 // function: SplitCommonBlock
-// purpose: 
+// purpose:
 //=======================================================================
-  void NMTTools_PaveFiller::SplitCommonBlock(const NMTTools_CommonBlock& aCB,
-                                             NMTTools_ListOfCommonBlock& aLCBx)
+void NMTTools_PaveFiller::SplitCommonBlock(const NMTTools_CommonBlock& aCB,
+                                           NMTTools_ListOfCommonBlock& aLCBx)
 {
-  Standard_Integer i, j, k, nE, aNbE, aNbSPBx, aNbPB; 
+  Standard_Integer i, j,nE, aNbE, aNbSPBx, aNbPB, k;
   BOPTools_SequenceOfPaveBlock aSPBx;
   BOPTools_ListIteratorOfListOfPaveBlock anItLPB;
   BOPTools_ListIteratorOfListOfPave anIt;
-  
-  BOPTools_PaveBlockIterator anPBIt; 
+  BOPTools_PaveBlockIterator anPBIt;
   //
   const BOPTools_ListOfPaveBlock& aLPB=aCB.PaveBlocks();
   aNbE=aLPB.Extent();
   //
-  // 1. Whether we realy need to split the common block ?
+  // 1. Checking: Whether we realy need to split the common block ?
   anItLPB.Initialize(aLPB);
   for (; anItLPB.More(); anItLPB.Next()) {
     const BOPTools_PaveBlock& aPB=anItLPB.Value();
@@ -1346,12 +1349,43 @@ void MakeNewVertex(const TopTools_ListOfShape& aLV,
     }
   }
   //
-  // 3. Do new common blocks 
+  // 3. Do new common blocks
   //
   const TColStd_ListOfInteger& aLF=aCB.Faces();
   aNbSPBx=aSPBx.Length();
   aNbPB=aNbSPBx/aNbE;
   //
+  //modified by NIZNHY-PKV Fri Jun 04 14:07:37 2010f
+  //
+  Standard_Integer k1, k2, n11, n12, n21, n22;
+  //
+  for (i=1; i<=aNbPB; ++i) {
+    NMTTools_CommonBlock aCBx;
+    //
+    aCBx.AddFaces(aLF);
+    //
+    const BOPTools_PaveBlock& aPB1=aSPBx(i);
+    n11=aPB1.Pave1().Index();
+    n12=aPB1.Pave2().Index();
+    //
+    aCBx.AddPaveBlock(aPB1);
+    //
+    for (j=2; j<=aNbE; ++j) {
+      k1=(j-1)*aNbPB+1;
+      k2=k1+aNbPB-1;
+      for(k=k1; k<=k2; ++k) {
+        const BOPTools_PaveBlock& aPB2=aSPBx(k);
+        n21=aPB2.Pave1().Index();
+        n22=aPB2.Pave2().Index();
+        if ((n21==n11 && n22==n12) || (n21==n12 && n22==n11)) {
+          aCBx.AddPaveBlock(aPB2);
+          break;
+        }
+      }
+    }
+    aLCBx.Append(aCBx);
+  }
+  /*
   for (i=1; i<=aNbPB; ++i) {
     NMTTools_CommonBlock aCBx;
     //
@@ -1364,14 +1398,16 @@ void MakeNewVertex(const TopTools_ListOfShape& aLV,
     }
     aLCBx.Append(aCBx);
   }
+  */
+  //modified by NIZNHY-PKV Fri Jun 04 14:07:42 2010t
 }
 
 //=======================================================================
 // function: VertexParameters
-// purpose: 
+// purpose:
 //=======================================================================
 void VertexParameters(const IntTools_CommonPrt& aCPart,
-                      Standard_Real& aT1, 
+                      Standard_Real& aT1,
                       Standard_Real& aT2)
 {
   const IntTools_Range& aR1=aCPart.Range1();
@@ -1391,9 +1427,10 @@ void VertexParameters(const IntTools_CommonPrt& aCPart,
     aT2 = aCPart.VertexParameter2();
   }
 }
+
 //=======================================================================
 // function: KeepPave
-// purpose: 
+// purpose:
 //=======================================================================
 Standard_Boolean IsOnPave(const Standard_Real& aT1,
                           const IntTools_Range& aRange,
@@ -1409,7 +1446,7 @@ Standard_Boolean IsOnPave(const Standard_Real& aT1,
 
 //=======================================================================
 // function:FindChains
-// purpose: 
+// purpose:
 //=======================================================================
 void FindChains(const BOPTools_IDMapOfPaveBlockIMapOfPaveBlock& aMapCB,
                 NMTTools_ListOfCommonBlock& aLCB)
@@ -1445,9 +1482,10 @@ void FindChains(const BOPTools_IDMapOfPaveBlockIMapOfPaveBlock& aMapCB,
     aChain.Clear();
   }
 }
+
 //=======================================================================
 // function:ProcessBlock
-// purpose: 
+// purpose:
 //=======================================================================
 void ProcessBlock(const BOPTools_PaveBlock& aPB,
                   const BOPTools_IDMapOfPaveBlockIMapOfPaveBlock& aMapCB,
@@ -1469,13 +1507,14 @@ void ProcessBlock(const BOPTools_PaveBlock& aPB,
     ProcessBlock(aPBx, aMapCB, aProcessedBlocks, aChain);
   }
 }
+
 // Modified  to provide VS interference between
 // vertex as result of EE and a Face of argument
-// Thu Sep 14 14:35:18 2006 
+// Thu Sep 14 14:35:18 2006
 // Contribution of Samtech www.samcef.com BEGIN
 //=======================================================================
-// function: PerformVF1  
-// purpose: 
+// function: PerformVF1
+// purpose:
 //=======================================================================
   void NMTTools_PaveFiller::PerformVF1()
 {
@@ -1511,7 +1550,7 @@ void ProcessBlock(const BOPTools_PaveBlock& aPB,
     const TopoDS_Shape& aSnew=myDS->Shape(nNewShape);
     if (aSnew.ShapeType()!=TopAbs_VERTEX) {
       continue;
-    } 
+    }
     //
     const TopoDS_Vertex& aVnew=TopoDS::Vertex(aSnew);
     //
@@ -1540,5 +1579,5 @@ void ProcessBlock(const BOPTools_PaveBlock& aPB,
       }
     }
   }
-} 
+}
 // Contribution of Samtech www.samcef.com END