Salome HOME
Fix regression: storeViewParameters() does not work for OCC view
[modules/geom.git] / src / GEOMAlgo / GEOMAlgo_WESCorrector.cxx
index b56d73ced68f7755a22963050c4b7d241781017c..4ee7d7a69bccffd6372e367ed61e84351eb2c37f 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:       NMTAlgo_WESCorrector.cxx
-// Created:    
-// Author:     Peter KURNEV
-//             <pkv@irinox>
+// File:        NMTAlgo_WESCorrector.cxx
+// Created:     
+// Author:      Peter KURNEV
+//              <pkv@irinox>
 //
 #include <GEOMAlgo_WESCorrector.ixx>
 
+#include <Geom_Surface.hxx>
+
+#include <TopLoc_Location.hxx>
 #include <TopoDS.hxx>
+
 #include <TopoDS_Shape.hxx>
 #include <TopoDS_Wire.hxx>
 #include <TopoDS_Face.hxx>
@@ -34,6 +38,7 @@
 
 #include <BRep_Builder.hxx>
 #include <BRep_Tool.hxx>
+#include <BRepAdaptor_Surface.hxx>
 
 #include <TopTools_IndexedMapOfOrientedShape.hxx>
 #include <TopTools_ListIteratorOfListOfShape.hxx>
 #include <TopTools_MapIteratorOfMapOfShape.hxx>
 #include <TopoDS_Iterator.hxx>
 #include <GEOMAlgo_WireSplitter.hxx>
-
+#include <GEOMAlgo_WESScaler.hxx>
 
 static
   void MakeWire(const TopTools_ListOfShape& aLE, 
-               TopoDS_Wire& newWire);
+                TopoDS_Wire& newWire);
+
+
+static
+  Standard_Boolean IsToScale(const TopoDS_Face& aF, 
+                            Standard_Real& aScale);
 
 //=======================================================================
 // function: 
@@ -164,36 +174,36 @@ static
     while(1) {
       aNbVP=aMVP.Extent();
       for (j=1; j<=aNbVP; ++j) {
-       const TopoDS_Shape& aVP=aMVP(j);
-       const TopTools_ListOfShape& aLE=aMVE.FindFromKey(aVP);
-       aIt.Initialize(aLE);
-       for (; aIt.More(); aIt.Next()) {
-         const TopoDS_Shape& aE=aIt.Value();
-         if (aMEC.Contains(aE)) {
-           continue;
-         }
-         aMEC.Add(aE);
-         //
-         aItE.Initialize(aE);
-         for (; aItE.More(); aItE.Next()) {
-           const TopoDS_Shape& aVE=aItE.Value();
-           if (!aMVS.Contains(aVE)) {
-             aMVS.Add(aVE);
-             aMVAdd.Add(aVE);
-           }
-         }
-       }
+        const TopoDS_Shape& aVP=aMVP(j);
+        const TopTools_ListOfShape& aLE=aMVE.FindFromKey(aVP);
+        aIt.Initialize(aLE);
+        for (; aIt.More(); aIt.Next()) {
+          const TopoDS_Shape& aE=aIt.Value();
+          if (aMEC.Contains(aE)) {
+            continue;
+          }
+          aMEC.Add(aE);
+          //
+          aItE.Initialize(aE);
+          for (; aItE.More(); aItE.Next()) {
+            const TopoDS_Shape& aVE=aItE.Value();
+            if (!aMVS.Contains(aVE)) {
+              aMVS.Add(aVE);
+              aMVAdd.Add(aVE);
+            }
+          }
+        }
       }//for (j=1; j<=aNbVP; ++j) 
       //
       aNbVP=aMVAdd.Extent();
       if (!aNbVP) {
-       break; // from while(1)
+        break; // from while(1)
       }
       //
       aMVP.Clear();
       for (j=1; j<=aNbVP; ++j) {
-       const TopoDS_Shape& aVE=aMVAdd(j);
-       aMVP.Add(aVE);
+        const TopoDS_Shape& aVE=aMVAdd(j);
+        aMVP.Add(aVE);
       }
       aMVAdd.Clear();
     }// while(1) {
@@ -209,24 +219,26 @@ static
       aER=aMEC(j);
       //
       if (aMER.Contains(aER)) {
-       aER.Orientation(TopAbs_FORWARD);
-       aLEC.Append(aER);
-       aER.Orientation(TopAbs_REVERSED);
-       aLEC.Append(aER);
-       //
-       //modified by NIZNHY-PKV Tue Nov 28 12:02:29 2006f
-       //bClosed=BRep_Tool::IsClosed(TopoDS::Edge(aER), myWES->Face());
-       //if (!bClosed) {
-         bRegular=Standard_False;
-       //}
-       //modified by NIZNHY-PKV Tue Nov 28 12:02:33 2006t
+        aER.Orientation(TopAbs_FORWARD);
+        aLEC.Append(aER);
+        aER.Orientation(TopAbs_REVERSED);
+        aLEC.Append(aER);
+        //
+       bRegular=Standard_False;
       }
       else {
-       aLEC.Append(aER);
+        aLEC.Append(aER);
       }
       //
       if (bRegular) {
-       TopExp::MapShapesAndAncestors(aER, TopAbs_VERTEX, TopAbs_EDGE, aMVER);
+       //modified by NIZNHY-PKV Wed Oct 20 14:45:52 2010f
+       const  TopoDS_Edge& aEx=*((TopoDS_Edge*)&aER);
+       if (!BRep_Tool::Degenerated(aEx)) {
+         TopExp::MapShapesAndAncestors(aER, TopAbs_VERTEX, TopAbs_EDGE, aMVER);
+       }
+       //
+        //TopExp::MapShapesAndAncestors(aER, TopAbs_VERTEX, TopAbs_EDGE, aMVER);
+       //modified by NIZNHY-PKV Wed Oct 20 14:46:48 2010t
       }
     }//for (j=1; j<=aNbC; ++j) {
     //
@@ -235,20 +247,20 @@ static
       //
       aNbVR=aMVER.Extent();
       for (k=1; k<=aNbVR; ++k) {
-       const TopTools_ListOfShape& aLER=aMVER(k);
-       aNbER=aLER.Extent();
-       if (aNbER==1) {
-         const TopoDS_Edge& aEx=TopoDS::Edge(aER);
-         bClosed=BRep_Tool::IsClosed(aEx, myWES->Face());
-         if (!bClosed) {
-           bRegular=!bRegular;
-           break;
-         }
-       }
-       if (aNbER>2) {
-         bRegular=!bRegular;
-         break;
-       }
+        const TopTools_ListOfShape& aLER=aMVER(k);
+        aNbER=aLER.Extent();
+        if (aNbER==1) {
+          const TopoDS_Edge& aEx=TopoDS::Edge(aER);
+          bClosed=BRep_Tool::IsClosed(aEx, myWES->Face());
+          if (!bClosed) {
+            bRegular=!bRegular;
+            break;
+          }
+        }
+        if (aNbER>2) {
+          bRegular=!bRegular;
+          break;
+        }
       }
     }
     //
@@ -265,21 +277,24 @@ static
 //=======================================================================
   void GEOMAlgo_WESCorrector::DoCorrections()
 {
-  Standard_Boolean bIsRegular, bIsNothingToDo;
+  Standard_Boolean bIsRegular, bIsNothingToDo, bToScale;
   Standard_Integer iErr;
+  Standard_Real aScale;
   TopoDS_Wire aW;
   BOP_ListIteratorOfListOfConnexityBlock aCBIt;
+  GEOMAlgo_WESScaler aWSC;
   //
   const TopoDS_Face& aF=myWES->Face();
   //
+  bToScale=IsToScale(aF, aScale);
+  //
   myNewWES.SetFace(aF);
   aCBIt.Initialize(myConnexityBlocks);
   for (; aCBIt.More(); aCBIt.Next()) {
     const BOP_ConnexityBlock& aCB=aCBIt.Value();
     const TopTools_ListOfShape& aLE=aCB.Shapes();
-
+    //
     bIsRegular=aCB.IsRegular();
-
     if (bIsRegular) {
       MakeWire(aLE, aW);
       myNewWES.AddShape (aW);
@@ -288,30 +303,84 @@ static
     //
     GEOMAlgo_WireSplitter aWS;
     //
-    aWS.SetFace(aF);
-    aWS.SetEdges(aLE);
-    //
-    aWS.Perform();
-    iErr=aWS.ErrorStatus();
-    if (iErr) {
-      continue;
-    }
-    bIsNothingToDo=aWS.IsNothingToDo();
-    if (bIsNothingToDo) {
-      MakeWire(aLE, aW);
-      myNewWES.AddShape (aW);
-      continue;
-    }
+    if(bToScale) {
+      TopoDS_Shape aE;
+      TopTools_ListIteratorOfListOfShape aIt;
+      BOPTColStd_ListIteratorOfListOfListOfShape aItLLSS;
+      //
+      aWSC.SetScale(aScale);
+      aWSC.SetFace(aF);
+      aWSC.SetEdges(aLE);
+      //
+      aWSC.Perform();
+      iErr=aWSC.ErrorStatus();
+      if (iErr) {
+       return;
+      }
+      //
+      const TopoDS_Face& aFS=aWSC.FaceScaled();
+      const TopTools_ListOfShape& aLES=aWSC.EdgesScaled();
+      //
+      aWS.SetFace(aFS);
+      aWS.SetEdges(aLES);
+      //
+      aWS.Perform();
+      iErr=aWS.ErrorStatus();
+      if (iErr) {
+       continue;
+      }
+      //
+      bIsNothingToDo=aWS.IsNothingToDo();
+      if (bIsNothingToDo) {
+       MakeWire(aLE, aW);
+       myNewWES.AddShape (aW);
+       continue;
+      }
+      //
+      const BOPTColStd_ListOfListOfShape& aLLSS=aWS.Shapes();
+      aItLLSS.Initialize(aLLSS);
+      for (; aItLLSS.More(); aItLLSS.Next()) {
+       TopTools_ListOfShape aLS;
+       //
+       const TopTools_ListOfShape& aLSS=aItLLSS.Value();
+       aIt.Initialize(aLSS);
+       for (; aIt.More(); aIt.Next()) {
+         const TopoDS_Shape& aES=aIt.Value();
+         aE=aWSC.Origin(aES);
+         aLS.Append(aE);
+       }
+       //
+       MakeWire(aLS, aW);
+       myNewWES.AddShape (aW);
+      }
+    }//if(bToScale)
     //
-    const BOPTColStd_ListOfListOfShape& aSSS=aWS.Shapes();
-    
-    BOPTColStd_ListIteratorOfListOfListOfShape aWireIt(aSSS);
-    for (; aWireIt.More(); aWireIt.Next()) {
-      const TopTools_ListOfShape& aLEx=aWireIt.Value();
+    else {
+      aWS.SetFace(aF);
+      aWS.SetEdges(aLE);
       //
-      MakeWire(aLEx, aW);
-      myNewWES.AddShape (aW);
-    }
+      aWS.Perform();
+      iErr=aWS.ErrorStatus();
+      if (iErr) {
+       continue;
+      }
+      bIsNothingToDo=aWS.IsNothingToDo();
+      if (bIsNothingToDo) {
+       MakeWire(aLE, aW);
+       myNewWES.AddShape (aW);
+       continue;
+      }
+      //
+      const BOPTColStd_ListOfListOfShape& aSSS=aWS.Shapes();
+    
+      BOPTColStd_ListIteratorOfListOfListOfShape aWireIt(aSSS);
+      for (; aWireIt.More(); aWireIt.Next()) {
+       const TopTools_ListOfShape& aLEx=aWireIt.Value();
+       //
+       MakeWire(aLEx, aW);
+       myNewWES.AddShape (aW);
+      }
+    }// else
   }
 }
 //=======================================================================
@@ -319,7 +388,7 @@ static
 // purpose: 
 //=======================================================================
   void MakeWire(const TopTools_ListOfShape& aLE, 
-               TopoDS_Wire& newWire)
+                TopoDS_Wire& newWire)
 {
   BRep_Builder aBB;
   aBB.MakeWire(newWire);
@@ -330,3 +399,36 @@ static
     aBB.Add(newWire, aE);
   }
 }
+//
+
+//=======================================================================
+//function : IsToScale
+//purpose  : 
+//=======================================================================
+Standard_Boolean IsToScale(const TopoDS_Face& aF, 
+                          Standard_Real& aScale)
+{
+  Standard_Boolean bRet;
+  Standard_Real aV1, aV2, dV, aTr;
+  GeomAbs_SurfaceType aType;
+  BRepAdaptor_Surface aBAS;
+  //
+  bRet=Standard_False;
+  aScale=1.;
+  //
+  aBAS.Initialize(aF);
+  aType=aBAS.GetType();
+  if (aType==GeomAbs_Cylinder) {
+    aTr=1.e5;
+    aV1=aBAS.FirstVParameter();
+    aV2=aBAS.LastVParameter();
+    dV=aV2-aV1;
+    if (dV>aTr) {
+      bRet=!bRet;
+      aScale=1./aTr;
+    }
+  }
+  return bRet;
+}
+