Salome HOME
Mantis issue 0020894: EDF 1421 GEOM: Partition Bug with big geometrical objects....
[modules/geom.git] / src / NMTTools / NMTTools_PaveFiller_8.cxx
index 0226377d11429cb3af131566276e810f2df713fc..fd3a6edaa5f17279c0efe26ea217977ef53230d7 100644 (file)
@@ -1,30 +1,33 @@
-// Copyright (C) 2005  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-// 
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either 
-// version 2.1 of the License.
-// 
-// This library is distributed in the hope that it will be useful 
-// but WITHOUT ANY WARRANTY; without even the implied warranty of 
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
-// Lesser General Public License for more details.
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
 //
-// You should have received a copy of the GNU Lesser General Public  
-// License along with this library; if not, write to the Free Software 
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//  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
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
-// File:       NMTTools_PaveFiller_8.cxx
-// Created:    Fri Dec 19 11:15:53 2003
-// Author:     Peter KURNEV
-//             <pkv@irinox>
-
 
+// File:        NMTTools_PaveFiller_8.cxx
+// Created:     Fri Dec 19 11:15:53 2003
+// Author:      Peter KURNEV
+//              <pkv@irinox>
+//
 #include <NMTTools_PaveFiller.ixx>
 
+#include <TColStd_MapOfInteger.hxx>
 #include <TColStd_ListOfInteger.hxx>
 #include <TColStd_ListIteratorOfListOfInteger.hxx>
 
 #include <NMTTools_CommonBlock.hxx>
 #include <NMTTools_CommonBlockAPI.hxx>
 
+
+// Modified  to add new method Thu Sep 14 14:35:18 2006 
+// Contribution of Samtech www.samcef.com BEGIN
+//=======================================================================
+// function:  SharedEdges
+// purpose:
+//=======================================================================
+  void NMTTools_PaveFiller::SharedEdges(const Standard_Integer nF1,
+                                        const Standard_Integer nF2,
+                                        TColStd_ListOfInteger& aLNE,
+                                        TopTools_ListOfShape& aLSE)
+{
+  Standard_Integer nE1, nE2;
+  TColStd_MapOfInteger aM1;
+  //
+  BooleanOperations_ShapesDataStructure *pDS=myDS;
+  BooleanOperations_OnceExplorer aExp(*pDS);
+  //
+  aExp.Init(nF1, TopAbs_EDGE);
+  for (; aExp.More(); aExp.Next()) {
+    nE1=aExp.Current();
+    aM1.Add(nE1);
+  }
+  
+  aExp.Init(nF2, TopAbs_EDGE);
+  for (; aExp.More(); aExp.Next()) {
+    nE2=aExp.Current();
+    if (aM1.Contains(nE2)) {
+      aLNE.Append(nE2);
+      const TopoDS_Shape& aE2=myDS->Shape(nE2);
+      aLSE.Append(aE2);
+    }
+  }
+}
+// Contribution of Samtech www.samcef.com END
+//
+//=======================================================================
+// function: RealPaveBlock
+// purpose:
+//=======================================================================
+  const BOPTools_PaveBlock& NMTTools_PaveFiller::RealPaveBlock
+     (const BOPTools_PaveBlock& aPB,
+      TColStd_ListOfInteger& aLB,
+      Standard_Integer& aIsCommonBlock)
+{
+  Standard_Integer nE, nSpx;
+  BOPTools_ListIteratorOfListOfPaveBlock aItPBx;
+  //
+  aIsCommonBlock=0;
+  aLB.Clear();
+  nE=aPB.OriginalEdge();
+  const NMTTools_ListOfCommonBlock& aLCBE=myCommonBlockPool(myDS->RefEdge(nE));
+  NMTTools_CommonBlockAPI aCBAPI(aLCBE);
+  if (aCBAPI.IsCommonBlock(aPB)) {
+    NMTTools_CommonBlock& aCB=aCBAPI.CommonBlock(aPB);
+    //
+    aIsCommonBlock=1;   
+    //
+    const BOPTools_ListOfPaveBlock& aLPBx=aCB.PaveBlocks();
+    aItPBx.Initialize(aLPBx);
+    for (; aItPBx.More(); aItPBx.Next()) {
+      const BOPTools_PaveBlock& aPBx=aItPBx.Value();
+      nSpx=aPBx.Edge();
+      aLB.Append(nSpx);
+    }
+    //
+    const BOPTools_PaveBlock& aPBx=aCB.PaveBlock1();
+    return aPBx;
+  }
+  return aPB;
+}
+//
 //=======================================================================
 // function: RealPaveBlock
 // purpose:
 // purpose:
 //=======================================================================
   Standard_Integer NMTTools_PaveFiller::CommonBlocksFace(const Standard_Integer nF,
-                                                        NMTTools_ListOfCommonBlock& aLCB)
+                                                         NMTTools_ListOfCommonBlock& aLCB)
 {
   Standard_Integer nE;
   TopAbs_ShapeEnum aT;
 // purpose:
 //=======================================================================
   void NMTTools_PaveFiller::RealSplitsFace(const Standard_Integer nF,
-                                          BOPTools_ListOfPaveBlock& aLPB)
+                                           BOPTools_ListOfPaveBlock& aLPB)
 {
   Standard_Integer nE;
   BOPTools_ListIteratorOfListOfPaveBlock anIt;
 // purpose:
 //=======================================================================
   Standard_Boolean NMTTools_PaveFiller::HasRealSplitsInOnFace(const Standard_Integer nF1,
-                                                             const Standard_Integer nF2)
+                                                              const Standard_Integer nF2)
 {
   Standard_Boolean bFlag;
   BOPTools_ListOfPaveBlock aLPB;
 // purpose:
 //=======================================================================
   void NMTTools_PaveFiller::RealSplitsInFace(const Standard_Integer ,//for overriding
-                                            const Standard_Integer nF1,
-                                            const Standard_Integer nF2,
-                                            BOPTools_ListOfPaveBlock& aLPB)
+                                             const Standard_Integer nF1,
+                                             const Standard_Integer nF2,
+                                             BOPTools_ListOfPaveBlock& aLPB)
 {
   Standard_Integer nE1;
   //
 // purpose:
 //=======================================================================
   void NMTTools_PaveFiller::RealSplitsInFace(const Standard_Integer nE1,
-                                            const Standard_Integer nF2,
-                                            BOPTools_ListOfPaveBlock& aLPB)
+                                             const Standard_Integer nF2,
+                                             BOPTools_ListOfPaveBlock& aLPB)
 {
   Standard_Integer nF1;
   //
     for (; anItLFCB.More(); anItLFCB.Next()) {
       nF1=anItLFCB.Value();
       if (nF1==nF2) {
-       aLPB.Append(aPB1R);
+        aLPB.Append(aPB1R);
       }
     }
   }
 // purpose:
 //=======================================================================
   void NMTTools_PaveFiller::RealSplitsOnEdge(const Standard_Integer nE1,
-                                            const Standard_Integer nE2,
-                                            BOPTools_ListOfPaveBlock& aLPB)
+                                             const Standard_Integer nE2,
+                                             BOPTools_ListOfPaveBlock& aLPB)
 {
   Standard_Integer nE;
   //
       const BOPTools_PaveBlock& aPB2=anIt.Value();
       nE=aPB2.OriginalEdge();
       if (nE==nE2) {
-       aLPB.Append(aPB1R);
+        aLPB.Append(aPB1R);
       }
     }
   }
 // purpose:
 //=======================================================================
   void NMTTools_PaveFiller::RealSplitsOnFace(const Standard_Integer nE1,
-                                            const Standard_Integer nF2,
-                                            BOPTools_ListOfPaveBlock& aLPB)
+                                             const Standard_Integer nF2,
+                                             BOPTools_ListOfPaveBlock& aLPB)
 {
   Standard_Integer nE2;
   //
 // purpose:
 //=======================================================================
   void NMTTools_PaveFiller::RealSplitsOnFace(const Standard_Integer ,//for overriding
-                                            const Standard_Integer nF1,
-                                            const Standard_Integer nF2,
-                                            BOPTools_ListOfPaveBlock& aLPB)
+                                             const Standard_Integer nF1,
+                                             const Standard_Integer nF2,
+                                             BOPTools_ListOfPaveBlock& aLPB)
 {
   Standard_Integer nE1;
   //
 // purpose:
 //=======================================================================
   Standard_Integer NMTTools_PaveFiller::SplitsFace(const Standard_Integer nF,
-                                                  BOPTools_ListOfPaveBlock& aLPB)
+                                                   BOPTools_ListOfPaveBlock& aLPB)
 {
   Standard_Integer nE;
   TopAbs_ShapeEnum aT;
 // purpose: splits of edges from nF1 in nF2
 //=======================================================================
   Standard_Integer NMTTools_PaveFiller::SplitsInFace(const Standard_Integer ,//for overriding
-                                                    const Standard_Integer nF1,
-                                                    const Standard_Integer nF2,
-                                                    BOPTools_ListOfPaveBlock& aLPB)
+                                                     const Standard_Integer nF1,
+                                                     const Standard_Integer nF2,
+                                                     BOPTools_ListOfPaveBlock& aLPB)
 {
   Standard_Integer nE1;
   TopAbs_ShapeEnum aT1, aT2;
 // purpose: splits of edge nE1 in aFace2
 //=======================================================================
   Standard_Integer NMTTools_PaveFiller::SplitsInFace(const Standard_Integer nE1,
-                                                    const Standard_Integer nF2,
-                                                    BOPTools_ListOfPaveBlock& aLPB)
+                                                     const Standard_Integer nF2,
+                                                     BOPTools_ListOfPaveBlock& aLPB)
 {
   Standard_Integer nF1;
   TopAbs_ShapeEnum aT1, aT2;
     for (; anItLFCB.More(); anItLFCB.Next()) {
       nF1=anItLFCB.Value();
       if (nF1==nF2) {
-       aLPB.Append(aPB1);
+        aLPB.Append(aPB1);
       }
     }
   }
 // purpose:  splits of edge nE1 on nE2
 //=======================================================================
   Standard_Integer NMTTools_PaveFiller::SplitsOnEdge(const Standard_Integer nE1,
-                                                    const Standard_Integer nE2,
-                                                    BOPTools_ListOfPaveBlock& aLPB)
+                                                     const Standard_Integer nE2,
+                                                     BOPTools_ListOfPaveBlock& aLPB)
 {
   Standard_Integer nE;
   TopAbs_ShapeEnum aT1, aT2;
       const BOPTools_PaveBlock& aPB2=anIt.Value();
       nE=aPB2.OriginalEdge();
       if (nE==nE2) {
-       aLPB.Append(aPB1);
+        aLPB.Append(aPB1);
       }
     }
   }
 // purpose:  splits of edge nE1 on face nF2
 //=======================================================================
   Standard_Integer NMTTools_PaveFiller::SplitsOnFace(const Standard_Integer nE1,
-                                                    const Standard_Integer nF2,
-                                                    BOPTools_ListOfPaveBlock& aLPB)
+                                                     const Standard_Integer nF2,
+                                                     BOPTools_ListOfPaveBlock& aLPB)
 {
   Standard_Integer nE2, ip;
   TopAbs_ShapeEnum aT1, aT2;
 // purpose:  splits of edges from face nF1 on face nF2
 //=======================================================================
   Standard_Integer NMTTools_PaveFiller::SplitsOnFace(const Standard_Integer ,//for overriding
-                                                    const Standard_Integer nF1,
-                                                    const Standard_Integer nF2,
-                                                    BOPTools_ListOfPaveBlock& aLPB)
+                                                     const Standard_Integer nF1,
+                                                     const Standard_Integer nF2,
+                                                     BOPTools_ListOfPaveBlock& aLPB)
 {
   Standard_Integer nE1, ip;
   TopAbs_ShapeEnum aT1, aT2;
 // purpose:
 //=======================================================================
   Standard_Integer NMTTools_PaveFiller::SplitsFace(const Standard_Integer nF,
-                                                  TColStd_ListOfInteger& aSplits)
+                                                   TColStd_ListOfInteger& aSplits)
 {
   Standard_Integer nE, iErr;
   BOPTools_ListIteratorOfListOfPaveBlock aIt;
 // purpose: splits of edges from nF1 in nF2
 //=======================================================================
   Standard_Integer NMTTools_PaveFiller::SplitsInFace(const Standard_Integer ,//for overriding
-                                                    const Standard_Integer nF1,
-                                                    const Standard_Integer nF2,
-                                                    TColStd_ListOfInteger& aSplits)
+                                                     const Standard_Integer nF1,
+                                                     const Standard_Integer nF2,
+                                                     TColStd_ListOfInteger& aSplits)
 {
   Standard_Integer nE, iErr;
   BOPTools_ListIteratorOfListOfPaveBlock aIt;
 // purpose: splits of edge nE1 in aFace2
 //=======================================================================
   Standard_Integer NMTTools_PaveFiller::SplitsInFace(const Standard_Integer nE1,
-                                                    const Standard_Integer nF2,
-                                                    TColStd_ListOfInteger& aSplits)
+                                                     const Standard_Integer nF2,
+                                                     TColStd_ListOfInteger& aSplits)
 {
   Standard_Integer nE, iErr;
   BOPTools_ListIteratorOfListOfPaveBlock aIt;
 // purpose:  splits of edge nE1 on nE2
 //=======================================================================
   Standard_Integer NMTTools_PaveFiller::SplitsOnEdge(const Standard_Integer nE1,
-                                                    const Standard_Integer nE2,
-                                                    TColStd_ListOfInteger& aSplits)
+                                                     const Standard_Integer nE2,
+                                                     TColStd_ListOfInteger& aSplits)
 {
   Standard_Integer nE, iErr;
   BOPTools_ListIteratorOfListOfPaveBlock aIt;
 // purpose:  splits of edge nE1 on face nF2
 //=======================================================================
   Standard_Integer NMTTools_PaveFiller::SplitsOnFace(const Standard_Integer nE1,
-                                                    const Standard_Integer nF2,
-                                                    TColStd_ListOfInteger& aSplits)
+                                                     const Standard_Integer nF2,
+                                                     TColStd_ListOfInteger& aSplits)
 {
   Standard_Integer nE, iErr;
   BOPTools_ListIteratorOfListOfPaveBlock aIt;
 // purpose:  splits of edges from face nF1 on face nF2
 //=======================================================================
   Standard_Integer NMTTools_PaveFiller::SplitsOnFace(const Standard_Integer ,//for overriding
-                                                    const Standard_Integer nF1,
-                                                    const Standard_Integer nF2,
-                                                    TColStd_ListOfInteger& aSplits)
+                                                     const Standard_Integer nF1,
+                                                     const Standard_Integer nF2,
+                                                     TColStd_ListOfInteger& aSplits)
 {
   Standard_Integer nE, iErr;
   BOPTools_ListIteratorOfListOfPaveBlock aIt;