Salome HOME
Update for gcc4.1
[modules/geom.git] / src / NMTTools / NMTTools_PaveFiller_6.cxx
index d308457f91ce00873b9d8999a1f15698ac560de0..8c4852a4b076d57f130d07bf9aecc0b2b5554371 100644 (file)
@@ -1,3 +1,22 @@
+// 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.
+//
+// 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_6.cxx
 // Created:    Fri Dec 19 10:27:31 2003
 // Author:     Peter KURNEV
@@ -11,6 +30,7 @@
 #include <TColStd_MapOfInteger.hxx>
 
 #include <Geom2d_Curve.hxx>
+#include <Geom2d_TrimmedCurve.hxx>
 #include <Geom_TrimmedCurve.hxx>
 
 #include <GeomAdaptor_Curve.hxx>
@@ -25,6 +45,7 @@
 #include <BRep_Builder.hxx>
 #include <BRep_Tool.hxx>
 #include <BRepBndLib.hxx>
+#include <BRepLib.hxx>
 
 #include <TopTools_IndexedMapOfShape.hxx>
 
 #include <NMTDS_ShapesDataStructure.hxx>
 #include <NMTTools_IndexedDataMapOfShapePaveBlock.hxx>
 #include <NMTTools_CommonBlockAPI.hxx>
-#include <Geom2d_Curve.hxx>
 #include <NMTTools_Tools.hxx>
-#include <BRepLib.hxx>
-#include <Geom2d_TrimmedCurve.hxx>
 
 static 
   Standard_Boolean IsPairFound(const Standard_Integer nF1,
@@ -84,6 +102,7 @@ static
   Standard_Boolean IsFound(const TColStd_IndexedMapOfInteger& aMapWhat,
                           const TColStd_IndexedMapOfInteger& aMapWith);
 
+
 //=======================================================================
 // function: PerformFF
 // purpose: 
@@ -220,9 +239,9 @@ static
   Standard_Integer i, aNbFFs, nF1, nF2, aBid=0;
   Standard_Integer nV1, nV2, j, aNbCurves;
   Standard_Real aTolR3D, aTol2D, aT1, aT2, aTolPPC=Precision::PConfusion();
-  TColStd_MapOfInteger aMap;
   NMTTools_IndexedDataMapOfShapePaveBlock aMEPB;
   BooleanOperations_IndexedDataMapOfShapeInteger aMapEI;
+  BOPTools_ListIteratorOfListOfPaveBlock anIt;  
   //
   BOPTools_CArray1OfSSInterference& aFFs=myIntrPool->SSInterferences();
   //
@@ -238,21 +257,48 @@ static
     const TopoDS_Face& aF1=TopoDS::Face(myDS->Shape(nF1));
     const TopoDS_Face& aF2=TopoDS::Face(myDS->Shape(nF2));
     //
-    // Add blocks that are existing ones for this FF-interference
-    BOPTools_ListOfPaveBlock aLPB;
+    BOPTools_ListOfPaveBlock aLPB, aLPBC;
+    //
+    {
+      Standard_Integer nFj1, nFj2, nE;
+      TColStd_IndexedMapOfInteger aMFence;
+      BOPTools_ListOfPaveBlock aLPBCx;
+      //
+      for (j=1; j<=aNbFFs; ++j) {
+       BOPTools_SSInterference& aFFj=aFFs(j);
+       aFFj.Indices(nFj1, nFj2);
+       //
+       if ((nF1==nFj1 && nFj2!=nF2) ||
+           (nF1==nFj2 && nFj1!=nF2) ||
+           (nF2==nFj1 && nFj2!=nF1) ||
+           (nF2==nFj2 && nFj1!=nF1)) {
+         RealSplitsInFace (aBid, nFj1, nFj2, aLPBCx);
+         RealSplitsInFace (aBid, nFj2, nFj1, aLPBCx);
+         RealSplitsOnFace (aBid, nFj1, nFj2, aLPBCx);
+       }
+      }
+      //
+      anIt.Initialize(aLPBCx);
+      for (; anIt.More(); anIt.Next()) {
+       const BOPTools_PaveBlock& aPBCx=anIt.Value();
+       //
+       nE=aPBCx.Edge();
+       if (!aMFence.Contains(nE)) {
+         aMFence.Add(nE);
+         aLPBC.Append(aPBCx);
+       }
+      }
+    }
+    //
+    //
     RealSplitsInFace (aBid, nF1, nF2, aLPB);
     RealSplitsInFace (aBid, nF2, nF1, aLPB);
     RealSplitsOnFace (aBid, nF1, nF2, aLPB);
     //
-    aMap.Clear();
-    BOPTools_ListIteratorOfListOfPaveBlock anIt(aLPB);
+    anIt.Initialize(aLPB);
     for (; anIt.More(); anIt.Next()) {
       const BOPTools_PaveBlock& aPB=anIt.Value();
       aFFi.AppendBlock(aPB);
-      nV1=aPB.Pave1().Index();
-      nV2=aPB.Pave2().Index();
-      aMap.Add(nV1);
-      aMap.Add(nV2);
     }
     //
     BOPTools_SequenceOfCurves& aSCvs=aFFi.Curves();
@@ -266,7 +312,8 @@ static
     //
     BOPTools_PaveSet aPSF;
     //
-    PrepareSetForFace (nF1, nF2, aPSF);
+    PrepareSetForFace (nF1, nF2, aLPBC, aPSF);
+    //PrepareSetForFace (nF1, nF2, aPSF);
     //
     // Put Paves On Curves
     for (j=1; j<=aNbCurves; ++j) {
@@ -306,9 +353,16 @@ static
          continue;// mkk ft
        }
        //
-       bIsExistingPaveBlock=IsExistingPaveBlock(aPBNew, aFFi);
+       // 1
+       const BOPTools_ListOfPaveBlock& aLPBFF=aFFi.PaveBlocks();
+       bIsExistingPaveBlock=IsExistingPaveBlock(aPBNew, aLPBFF, aTolR3D);
+       //bIsExistingPaveBlock=IsExistingPaveBlock(aPBNew, aFFi);
+       if (bIsExistingPaveBlock) {
+         continue;
+       }
+       // 2
+       bIsExistingPaveBlock=IsExistingPaveBlock(aPBNew, aLPBC, aTolR3D);
        if (bIsExistingPaveBlock) {
-         // aPBNew was (or just lays) boundary PB 
          continue;
        }
        // Checking of validity in 2D
@@ -512,8 +566,11 @@ static
     //
     nF1=aPBSE.Face1();
     nF2=aPBSE.Face2();
-    const TopoDS_Face& aF1=TopoDS::Face(myDS->Shape(nF1));
-    const TopoDS_Face& aF2=TopoDS::Face(myDS->Shape(nF2));
+    //
+    //modified by NIZNHY-PKV Thu Jan 26 10:17:04 2006f
+    //const TopoDS_Face& aF1=TopoDS::Face(myDS->Shape(nF1));
+    //const TopoDS_Face& aF2=TopoDS::Face(myDS->Shape(nF2));
+    //modified by NIZNHY-PKV Thu Jan 26 10:17:08 2006t
     //
     const NMTTools_ListOfCommonBlock& aLCB=aCBP(tDS.RefEdge(i));
     NMTTools_CommonBlockAPI aCBAPI(aLCB);
@@ -522,12 +579,16 @@ static
     for (; aIt.More(); aIt.Next()) {
       BOPTools_PaveBlock aPB=aIt.Value();
       //
+      ////modified by NIZNHY-PKV Thu Jan 26 10:16:36 2006f
+      const TopoDS_Face& aF1=TopoDS::Face(myDS->Shape(nF1));
+      const TopoDS_Face& aF2=TopoDS::Face(myDS->Shape(nF2));
+      ////modified by NIZNHY-PKV Thu Jan 26 10:16:39 2006t
+      //
       if (aCBAPI.IsCommonBlock(aPB)) {
        // it can be Common Block
-       Standard_Boolean bHasPCOnF, bFound;
-       Standard_Integer nF, k, nEOrx, nF1x, nF2x;
-       Standard_Real aTolEx, aT1x, aT2x;
-       BOPTools_ListIteratorOfListOfPaveBlock aItPBx;
+       Standard_Real aTolEx;
+       Handle(Geom2d_Curve) aC2D1, aC2D2;
+       TopoDS_Face aF1FWD, aF2FWD;
        //
        NMTTools_CommonBlock& aCB=aCBAPI.CommonBlock(aPB);
        const BOPTools_ListOfPaveBlock& aLPBx=aCB.PaveBlocks();
@@ -536,50 +597,16 @@ static
        mE=aPB.Edge(); // index of edge in tDS
        const TopoDS_Edge& aEx=TopoDS::Edge(tDS.Shape(mE));
        aTolEx=BRep_Tool::Tolerance(aEx);
+        //
+       // <- Block A was here
        //
-       for (k=0; k<2; ++k) {   
-         nF=(!k) ? nF1 : nF2;
-         const TopoDS_Face& aF=TopoDS::Face(myDS->Shape(nF));
-         //
-         bHasPCOnF=BOPTools_Tools2D::HasCurveOnSurface(aEx, aF); 
-         if (bHasPCOnF) {
-           continue;
-         }
-         //
-         bFound=Standard_False;
-         aItPBx.Initialize(aLPBx);
-         for (; aItPBx.More(); aItPBx.Next()) {
-           BOPTools_PaveBlock& aPBx=aIt.Value();
-           nEOrx=aPBx.OriginalEdge();
-           const TopoDS_Shape& aEOrx=tDS.Shape(nEOrx);
-           BOPTools_PaveBlock& aPBSEx=aMEPB.ChangeFromKey(aEOrx);
-           aT1x=aPBSEx.Pave1().Param();
-           aT2x=aPBSEx.Pave2().Param();
-           const IntTools_Curve& aICx=aPBSEx.Curve();
-           //
-           nF1x=aPBSEx.Face1();
-           nF2x=aPBSEx.Face2();
-           //
-           if (nF1x==nF) {
-             Handle(Geom2d_Curve) aC2D1x=aICx.FirstCurve2d();
-             Handle(Geom2d_TrimmedCurve)aC2D1xT =new Geom2d_TrimmedCurve(aC2D1x, aT1x, aT2x);
-             aBB.UpdateEdge(aEx, aC2D1xT, aF, aTolEx);
-             bFound=!bFound;
-             break;
-           }
-           //
-           if (nF2x==nF) {
-             Handle(Geom2d_Curve) aC2D2x=aICx.SecondCurve2d();
-             Handle(Geom2d_TrimmedCurve)aC2D2xT =new Geom2d_TrimmedCurve(aC2D2x, aT1x, aT2x);
-             aBB.UpdateEdge(aEx, aC2D2xT, aF, aTolEx);
-             bFound=!bFound;
-             break;
-           }
-         }
-         if (bFound){
-           BRepLib::SameParameter(aEx, aTolEx, Standard_True);
-         }
-       }
+       aF1FWD=aF1;
+       aF1FWD.Orientation(TopAbs_FORWARD);
+       NMTTools_Tools::MakePCurve(aEx, aF1FWD, aC2D1, aTolEx);
+       //
+       aF2FWD=aF2;
+       aF2FWD.Orientation(TopAbs_FORWARD);
+       NMTTools_Tools::MakePCurve(aEx, aF2FWD, aC2D2, aTolEx);
       } //if (aCBAPI.IsCommonBlock(aPB))
       //
       // new SE
@@ -677,106 +704,24 @@ static
       BOPTools_Tools2D::BuildPCurveForEdgeOnFace(aE, aF1FWD);
       BOPTools_Tools2D::BuildPCurveForEdgeOnFace(aE, aF2FWD);
     }
-    //
-    //  Section Edges processing
-    /*
-    Standard_Integer aNbCurves, k, aNbV; 
-    Standard_Real aTolEdge, aTolR2D, aTolFact, aTolV, aTolVmax; 
-    BRep_Builder aBB; 
-    //
-    BOPTools_SequenceOfCurves& aSC=aFF.Curves();
-    aNbCurves=aSC.Length();
-    if (!aNbCurves) {
-      continue;
-    }
-    //
-    const BOPTools_Curve& aBC=aSC(1);
-    const BOPTools_ListOfPaveBlock& aLPB=aBC.NewPaveBlocks();
-    anIt.Initialize(aLPB);
-    for (; anIt.More(); anIt.Next()) {
-      const BOPTools_PaveBlock& aPB=anIt.Value();
-      nE=aPB.Edge();
-      const TopoDS_Edge& aE=TopoDS::Edge(myDS->Shape(nE));
-      //
-      aTolEdge=BRep_Tool::Tolerance(aE);
-      aTolR2D=aFF.TolR2D();
-      aTolFact=Max(aTolEdge, aTolR2D);
-      //
-      // Check vertices tolerances and correct them if necessary 
-      // to prevent situation when TolE > TolV
-      //
-      TopTools_IndexedMapOfShape aVMap;
-      TopExp::MapShapes(aE, TopAbs_VERTEX, aVMap);
-
-      aTolVmax=-1.;
-      aNbV=aVMap.Extent();
-      for (k=1; k<=aNbV; ++k) {
-       const TopoDS_Vertex& aV=TopoDS::Vertex(aVMap(k));
-       aTolV=BRep_Tool::Tolerance(aV);
-       if (aTolV>aTolVmax) {
-         aTolVmax=aTolV;
-       }
-      }
-      //
-      if (aTolFact>aTolVmax) {
-       aTolFact=aTolVmax;
-      }
-      // 
-      Standard_Real aTFirst, aTLast, aOutFirst, aOutLast, aOutTol;
-      Handle(Geom2d_Curve) aC2D1, aC2D1A, aC2D2, aC2D2A;
-      Handle(Geom_TrimmedCurve)aC3DETrim;
-      //
-      const Handle(Geom_Curve)& aC3DE=BRep_Tool::Curve(aE, aTFirst, aTLast);
-      aC3DETrim=new Geom_TrimmedCurve(aC3DE, aTFirst, aTLast);
-      //
-      // first P-Curve
-      BOPTools_Tools2D::BuildPCurveForEdgeOnFace(aE, aF1FWD);
-      BOPTools_Tools2D::CurveOnSurface(aE, aF1FWD, aC2D1, aOutFirst, aOutLast, aOutTol, Standard_True);
-      //
-      if (aC3DE->IsPeriodic()) {
-       BOPTools_Tools2D::AdjustPCurveOnFace(aF1FWD, aTFirst, aTLast,  aC2D1, aC2D1A); 
-      }
-      else {
-       BOPTools_Tools2D::AdjustPCurveOnFace(aF1FWD, aC3DETrim, aC2D1, aC2D1A); 
-      }
-      //
-      aBB.UpdateEdge(aE, aC2D1A, aF1FWD, aTolFact);
-      // 
-      // second P-Curve
-      BOPTools_Tools2D::BuildPCurveForEdgeOnFace(aE, aF2FWD);
-      BOPTools_Tools2D::CurveOnSurface(aE, aF2FWD, aC2D2, aOutFirst, aOutLast, aOutTol, Standard_True);
-      //
-      if (aC3DE->IsPeriodic()) {
-       BOPTools_Tools2D::AdjustPCurveOnFace(aF2FWD, aTFirst, aTLast, aC2D2, aC2D2A); 
-      }
-      else {
-       BOPTools_Tools2D::AdjustPCurveOnFace(aF2FWD, aC3DETrim, aC2D2, aC2D2A); 
-      }
-      //
-      aBB.UpdateEdge(aE, aC2D2A, aF2FWD, aTolFact);
-    }
-    */
   } 
-  
 }
 //=======================================================================
 // function: IsExistingPaveBlock
 // purpose: 
 //=======================================================================
    Standard_Boolean NMTTools_PaveFiller::IsExistingPaveBlock(const BOPTools_PaveBlock& aPBNew,
-                                                            const BOPTools_SSInterference& aFFi)
+                                                            const BOPTools_ListOfPaveBlock& aLPBR,
+                                                            const Standard_Real aTolR3D)
 {
-  Standard_Boolean bFlag=Standard_False;
+  Standard_Boolean bFlag;
   Standard_Integer nVNew1, nVNew2, nV1, nV2, iC;
-  Standard_Real aTolR3D;
   BOPTools_ListIteratorOfListOfPaveBlock anIt;
   //
-  aTolR3D=aFFi.TolR3D();
-  //
+  bFlag=Standard_False;
   nVNew1=aPBNew.Pave1().Index();
   nVNew2=aPBNew.Pave2().Index();
   //
-  const BOPTools_ListOfPaveBlock& aLPBR=aFFi.PaveBlocks();
   anIt.Initialize(aLPBR);
   for (; anIt.More(); anIt.Next()) {
     const BOPTools_PaveBlock& aPBR=anIt.Value();
@@ -958,19 +903,35 @@ static
 //=======================================================================
   void NMTTools_PaveFiller::PrepareSetForFace(const Standard_Integer nF1,
                                              const Standard_Integer nF2,
-                                              BOPTools_PaveSet& aPSF)
+                                             const BOPTools_ListOfPaveBlock& aLPBC,
+                                             BOPTools_PaveSet& aPSF)
 {
   Standard_Integer nV1, nV2; 
   TColStd_MapOfInteger aMap;
-  BOPTools_ListOfPaveBlock aLPB1, aLPB2;
+  BOPTools_ListOfPaveBlock aLPB1, aLPB2, aLPBS;
   BOPTools_ListIteratorOfListOfPaveBlock anIt;
   //
   RealSplitsFace(nF1, aLPB1);
+  anIt.Initialize(aLPB1);
+  for (; anIt.More(); anIt.Next()) {
+    const BOPTools_PaveBlock& aPB=anIt.Value();
+    aLPBS.Append(aPB);
+  }
+  //
   RealSplitsFace(nF2, aLPB2);
+  anIt.Initialize(aLPB2);
+  for (; anIt.More(); anIt.Next()) {
+    const BOPTools_PaveBlock& aPB=anIt.Value();
+    aLPBS.Append(aPB);
+  }
   //
-  aLPB1.Append(aLPB2);
+  anIt.Initialize(aLPBC);
+  for (; anIt.More(); anIt.Next()) {
+    const BOPTools_PaveBlock& aPB=anIt.Value();
+    aLPBS.Append(aPB);
+  }
   //
-  anIt.Initialize(aLPB1);
+  anIt.Initialize(aLPBS);
   for (; anIt.More(); anIt.Next()) {
     const BOPTools_PaveBlock& aPB=anIt.Value();
     const BOPTools_Pave& aPave1=aPB.Pave1();
@@ -1149,3 +1110,60 @@ Standard_Boolean IsFound(const TColStd_IndexedMapOfInteger& aMapWhat,
   }
   return bFlag;
 }
+//
+//   Block A
+//
+      //
+        // Commented out by EAP in the frame of PAL9151
+        //
+//     Standard_Boolean bHasPCOnF, bFound;
+//     Standard_Integer nF, k, nEOrx, nF1x, nF2x;
+//     Standard_Real aTolEx, aT1x, aT2x;
+//     BOPTools_ListIteratorOfListOfPaveBlock aItPBx;
+       //
+//     for (k=0; k<2; ++k) {   
+//       nF=(!k) ? nF1 : nF2;
+//       const TopoDS_Face& aF=TopoDS::Face(myDS->Shape(nF));
+//       //
+//       bHasPCOnF=BOPTools_Tools2D::HasCurveOnSurface(aEx, aF); 
+//       if (bHasPCOnF) {
+//         continue;
+//       }
+//       //
+//       bFound=Standard_False;
+//       aItPBx.Initialize(aLPBx);
+//       for (; aItPBx.More(); aItPBx.Next()) {
+//         BOPTools_PaveBlock& aPBx=aIt.Value();
+//         nEOrx=aPBx.OriginalEdge();
+//         const TopoDS_Shape& aEOrx=tDS.Shape(nEOrx);
+//         BOPTools_PaveBlock& aPBSEx=aMEPB.ChangeFromKey(aEOrx);
+//         aT1x=aPBSEx.Pave1().Param();
+//         aT2x=aPBSEx.Pave2().Param();
+//         const IntTools_Curve& aICx=aPBSEx.Curve();
+//         //
+//         nF1x=aPBSEx.Face1();
+//         nF2x=aPBSEx.Face2();
+//         //
+//         if (nF1x==nF) {
+//           Handle(Geom2d_Curve) aC2D1x=aICx.FirstCurve2d();
+//           Handle(Geom2d_TrimmedCurve)aC2D1xT =new Geom2d_TrimmedCurve(aC2D1x, aT1x, aT2x);
+//           aBB.UpdateEdge(aEx, aC2D1xT, aF, aTolEx);
+//           bFound=!bFound;
+//           break;
+//         }
+//         //
+//         if (nF2x==nF) {
+//           Handle(Geom2d_Curve) aC2D2x=aICx.SecondCurve2d();
+//           Handle(Geom2d_TrimmedCurve)aC2D2xT =new Geom2d_TrimmedCurve(aC2D2x, aT1x, aT2x);
+//           aBB.UpdateEdge(aEx, aC2D2xT, aF, aTolEx);
+//           bFound=!bFound;
+//           break;
+//         }
+//       }
+//       if (bFound){
+//         BRepLib::SameParameter(aEx, aTolEx, Standard_True);
+//       }
+//     }
+        //
+        // The code till the if block end is restored from V2_2_2 revision
+