0021762: Integration of new Boolean Operation algorithm to OCCT.
[occt.git] / src / BOP / BOP_WireEdgeSet.cxx
diff --git a/src/BOP/BOP_WireEdgeSet.cxx b/src/BOP/BOP_WireEdgeSet.cxx
deleted file mode 100755 (executable)
index d211b63..0000000
+++ /dev/null
@@ -1,608 +0,0 @@
-// Created on: 1993-06-17
-// Created by: Jean Yves LEBEY
-// Copyright (c) 1993-1999 Matra Datavision
-// Copyright (c) 1999-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.
-
-// modified by NIZNHY-PKV 
-
-#include <BOP_WireEdgeSet.ixx>
-
-#include <Standard_ProgramError.hxx>
-
-#include <Precision.hxx>
-
-#include <gp_Vec.hxx>
-#include <gp_Vec2d.hxx>
-#include <gp_Pnt2d.hxx>
-#include <gp_Dir2d.hxx>
-
-#include <Geom2d_Curve.hxx>
-#include <Geom2d_Line.hxx>
-#include <Geom_Curve.hxx>
-#include <Geom_Surface.hxx>
-#include <GeomAbs_SurfaceType.hxx>
-#include <GeomAbs_CurveType.hxx>
-#include <GeomAPI_ProjectPointOnSurf.hxx>
-
-#include <BRep_Tool.hxx>
-#include <BRepAdaptor_Surface.hxx>
-#include <BRepAdaptor_Curve.hxx>
-
-#include <TopoDS.hxx>
-#include <TopAbs.hxx>
-#include <TopExp_Explorer.hxx>
-
-#include <BOPTools_Tools2D.hxx>
-
-// modified by NIZHNY-MKK  Fri May 30 10:18:01 2003.BEGIN
-#include <TopTools_IndexedMapOfShape.hxx>
-#include <TopExp.hxx>
-#include <BOPTools_Tools3D.hxx>
-
-static void GetOrientationVOnE(const TopoDS_Shape& V,
-                              const TopoDS_Shape& E1,
-                              const TopoDS_Shape& E2,
-                              TopAbs_Orientation& o1,
-                              TopAbs_Orientation& o2);
-// modified by NIZHNY-MKK  Fri May 30 10:18:03 2003.END
-
-//=======================================================================
-//function : BOP_WireEdgeSet::BOP_WireEdgeSet
-//purpose  : 
-//=======================================================================
-  BOP_WireEdgeSet::BOP_WireEdgeSet()
-:
-  BOP_ShapeSet(TopAbs_VERTEX)
-{
-}
-//=======================================================================
-//function : BOP_WireEdgeSet::BOP_WireEdgeSet
-//purpose  : 
-//=======================================================================
-  BOP_WireEdgeSet::BOP_WireEdgeSet(const TopoDS_Face& F)
-: 
-  BOP_ShapeSet(TopAbs_VERTEX),
-  myFace(F)
-{
-}
-
-//=======================================================================
-//function : Initialize
-//purpose  : 
-//=======================================================================
-  void BOP_WireEdgeSet::Initialize(const TopoDS_Face& F)
-{
-  myFace=F;
-}
-
-//=======================================================================
-//function : AddShape
-//purpose  : 
-//=======================================================================
-  void BOP_WireEdgeSet::AddShape(const TopoDS_Shape& S)
-{
-  ProcessAddShape(S);
-}
-
-//=======================================================================
-//function : AddStartElement
-//purpose  : 
-//=======================================================================
-  void BOP_WireEdgeSet::AddStartElement(const TopoDS_Shape& S)
-{
-  ProcessAddStartElement(S);
-}
-
-//=======================================================================
-//function : AddElement
-//purpose  : 
-//=======================================================================
-  void BOP_WireEdgeSet::AddElement(const TopoDS_Shape& S)
-{
-  BOP_ShapeSet::AddElement(S);
-}
-
-//=======================================================================
-//function : InitNeighbours
-//purpose  : 
-//=======================================================================
-  void  BOP_WireEdgeSet::InitNeighbours(const TopoDS_Shape& E)
-{
-  mySubShapeExplorer.Init(E,mySubShapeType);
-  myCurrentShape = E;
-
-  FindNeighbours();
-}
-
-
-//=======================================================================
-//function : FindNeighbours
-//purpose  : 
-//=======================================================================
-  void BOP_WireEdgeSet::FindNeighbours()
-{
-  while (mySubShapeExplorer.More()) {
-    
-    // l = list of edges neighbour of edge myCurrentShape trough
-    // the vertex mySubShapeExplorer.Current(), which is a vertex of the
-    // edge myCurrentShape.
-    const TopoDS_Shape& V = mySubShapeExplorer.Current();
-    
-    const TopTools_ListOfShape & l = 
-      MakeNeighboursList(myCurrentShape, V);
-
-    // myIncidentShapesIter iterates on the neighbour edges of the edge
-    // given as InitNeighbours() argument (this edge has been stored 
-    // in the field myCurrentShape).
-
-    myIncidentShapesIter.Initialize(l);
-    if (myIncidentShapesIter.More()) {
-      break;
-    }
-    else{
-      mySubShapeExplorer.Next();
-    }
-  }
-}
-
-//=======================================================================
-//function : MakeNeighboursList
-//purpose  : find edges connected to Earg by Varg 
-//=======================================================================
-  const TopTools_ListOfShape & BOP_WireEdgeSet::MakeNeighboursList(const TopoDS_Shape& Earg,
-                                                                  const TopoDS_Shape& Varg)
-{
-  const TopoDS_Edge&   E = TopoDS::Edge(Earg);
-  const TopoDS_Vertex& V = TopoDS::Vertex(Varg);
-
-  const TopTools_ListOfShape& l = mySubShapeMap.FindFromKey(Varg);
-
-  Standard_Integer nclosing = NbClosingShapes(l);
-  if (nclosing) { 
-    // build myCurrentShapeNeighbours = 
-    // edge list made of connected shapes to Earg through Varg
-    myCurrentShapeNeighbours.Clear();
-    
-    Standard_Integer iapp = 0;
-    for (TopTools_ListIteratorOfListOfShape it(l); it.More(); it.Next()) {
-      iapp++;
-      const TopoDS_Shape& curn = it.Value(); // current neighbour
-      Standard_Boolean k = VertexConnectsEdgesClosing(Varg, Earg, curn);
-      if (k) {
-       myCurrentShapeNeighbours.Append(curn);
-      }
-    }
-
-    Standard_Integer newn = NbClosingShapes(myCurrentShapeNeighbours);
-    if (newn >= 2 ) {
-
-      const TopoDS_Face& F = myFace;
-      // several sewing edges connected to E by V such as :
-      // orientation of V in E # orientation of V in its edges.
-      // one leaves among the connected sewing edges,
-      // only edge A that checks tg(E) ^ tg(A) > 0
-
-      TopAbs_Orientation Eori;
-      gp_Vec2d d1E; gp_Pnt2d pE;
-      Standard_Real fiE, laE, tolpc, parE;
-      
-      parE = BRep_Tool::Parameter(V,E);
-      
-      Handle(Geom2d_Curve) PCE;
-      BOPTools_Tools2D::CurveOnSurface(E, F, PCE, fiE, laE, tolpc, Standard_False);
-
-      if (!PCE.IsNull()){
-       PCE->D1(parE, pE, d1E);
-      }
-      else  {
-       LocalD1 (F, E, V, pE, d1E);
-      }
-
-      Eori = E.Orientation();
-      if (Eori == TopAbs_REVERSED) {
-       d1E.Reverse();
-      }
-
-      TopTools_ListIteratorOfListOfShape lclo(myCurrentShapeNeighbours);
-      Standard_Integer rang = 0;
-      while (lclo.More()) {
-       rang++;
-
-       if ( ! IsClosed(lclo.Value()) ) {
-         lclo.Next();
-         continue;
-       }
-
-       const TopoDS_Edge& EE = TopoDS::Edge(lclo.Value());
-       Standard_Real parEE,  fiEE, laEE, tolpcc;
-       gp_Vec2d d1EE; gp_Pnt2d pEE;
-       
-       parEE = BRep_Tool::Parameter(V,EE);
-       
-       Handle(Geom2d_Curve) PCEE;
-       BOPTools_Tools2D::CurveOnSurface (EE, F, PCEE, fiEE, laEE, tolpcc, Standard_False);//
-       //
-       if (!PCEE.IsNull()) {
-         PCEE->D1(parEE,pEE,d1EE);
-       
-       }
-       else {
-         LocalD1(F, EE, V, pEE, d1EE);
-       }
-
-       TopAbs_Orientation EEori = EE.Orientation();
-       if (EEori == TopAbs_REVERSED) d1EE.Reverse();
-
-       Standard_Real cross = d1E.Crossed(d1EE);
-       TopAbs_Orientation oVE,oVEE;
-
-       // modified by NIZHNY-MKK  Fri May 30 10:17:10 2003.BEGIN
-       GetOrientationVOnE(V,E,EE,oVE,oVEE);
-//     VertexConnectsEdges(V,E,EE,oVE,oVEE);
-       // modified by NIZHNY-MKK  Fri May 30 10:17:13 2003.END
-
-       Standard_Boolean t2 = ( (cross > 0) && oVE == TopAbs_REVERSED ) ||
-                             ( (cross < 0) && oVE == TopAbs_FORWARD );
-
-       if ( t2 ) { //-- t1
-         // this is proper IsClosed, only it is preserved among IsClosed 
-         lclo.Next();
-       }
-       else {
-         // edge IsClosed is suspended
-         myCurrentShapeNeighbours.Remove(lclo);
-       }
-      }// end of while (lclo.More())
-    }// end of if (newn >= 2 )
-    return myCurrentShapeNeighbours;
-  }// end of if (nclosing)
-
-  else {
-    return l;
-  }
-} // MakeNeighoursList
-
-//=======================================================================
-//function : VertexConnectsEdges
-//purpose  : 
-//=======================================================================
-  Standard_Boolean BOP_WireEdgeSet::VertexConnectsEdges(const TopoDS_Shape& V,
-                                                       const TopoDS_Shape& E1,
-                                                       const TopoDS_Shape& E2,
-                                                       TopAbs_Orientation& o1,
-                                                       TopAbs_Orientation& o2) const
-{
-  TopExp_Explorer ex1, ex2;
-  ex1.Init(E1,TopAbs_VERTEX);
-  for(; ex1.More(); ex1.Next()) {
-    
-    if (V.IsSame(ex1.Current())) {
-      ex2.Init(E2,TopAbs_VERTEX);
-      for(; ex2.More(); ex2.Next()) {
-       
-       if (V.IsSame(ex2.Current())) {
-         o1 = ex1.Current().Orientation();
-         o2 = ex2.Current().Orientation();
-         if ( o1 != o2 ) {
-           return Standard_True;
-         }
-       }
-      }
-    }
-  }
-  return Standard_False;
-}
-
-
-//=======================================================================
-//function : VertexConnectEdgesClosing
-//purpose  : 
-//=======================================================================
-  Standard_Boolean BOP_WireEdgeSet::VertexConnectsEdgesClosing(const TopoDS_Shape& V, 
-                                                              const TopoDS_Shape& E1, 
-                                                              const TopoDS_Shape& E2) const
-{
-//  Let S the set of incident edges on vertex V.
-//  S contains at least one closed edge on the periodic face to build.
-// (the face implied in closing test of edge is myFace)
-//  E1,E2 are S shapes (sharing V).
-//  
-//  if E1 and E2 are not closed : edges are NOT connected
-//  if E1 or E2 is/are closed :
-//    if V changes of relative orientation between E1,E2 : edges are connected
-//    else : edges are NOT connected
-//  
-//  example with E1 NOT closed, E2 closed :
-//
-//  E1 FORWARD, V REVERSED on E1 
-//  E2 FORWARD, V FORWARD on E2       --> edges are connected
-//
-//  E1 FORWARD, V REVERSED on E1 
-//  E2 REVERSED, V FORWARD on E2      --> edges are NOT connected
-//-----------------------------------------------------------------------
-
-  Standard_Boolean c1 = IsClosed(E1);
-  Standard_Boolean c2 = IsClosed(E2);
-
-  Standard_Boolean testconnect = c1 || c2;
-  Standard_Boolean resu = Standard_False;
-  TopAbs_Orientation o1,o2;
-
-  // SSCONNEX = False ==> E2 is  selected to create as many 
-  // (default)           faces as there are components connected in UV.
-  // SSCONNEX = True ==> the entire edge E2 sharing V with E1 is taken
-  //                     so that orientation(V/E1) # orientation(V/E2)
-  //                     ==> face of part and other sewings
-  if ((c1 && c2)) {
-    Standard_Boolean u1 = c1 ? IsUClosed(E1) : Standard_False; 
-    Standard_Boolean v1 = c1 ? IsVClosed(E1) : Standard_False; 
-    Standard_Boolean u2 = c2 ? IsUClosed(E2) : Standard_False; 
-    Standard_Boolean v2 = c2 ? IsVClosed(E2) : Standard_False; 
-    Standard_Boolean uvdiff = (u1 && v2) || (u2 && v1);
-    testconnect = uvdiff;
-  }
-
-  if (testconnect) {
-    resu = VertexConnectsEdges(V,E1,E2,o1,o2);
-  }
-  else { 
-    // cto 012 O2 sewing edge of cylindric face
-    // chain of components split ON and OUT of the same orientation
-    TopAbs_Orientation oe1 = E1.Orientation();
-    TopAbs_Orientation oe2 = E2.Orientation();
-    Standard_Boolean iseq = E1.IsEqual(E2);
-    if ( (c1 && c2) && (oe1 == oe2) && (!iseq) ) {
-      resu = VertexConnectsEdges(V,E1,E2,o1,o2);
-    }
-  }
-  return resu;
-}
-
-//=======================================================================
-//function : NbClosingShapes
-//purpose  : 
-//=======================================================================
-  Standard_Integer BOP_WireEdgeSet::NbClosingShapes(const TopTools_ListOfShape & L) const
-{
-  Standard_Integer n = 0;
-  TopTools_ListIteratorOfListOfShape it(L);
-  for ( ; it.More(); it.Next()) {
-    const TopoDS_Shape& S = it.Value();
-    if ( IsClosed(S) ) {
-      n++;
-    }
-  }
-  return n;
-}
-
-//=======================================================================
-//function : LocalD1
-//purpose  : 
-//=======================================================================
-  void BOP_WireEdgeSet::LocalD1(const TopoDS_Face&  F,
-                               const TopoDS_Edge&  E,
-                               const TopoDS_Vertex& V,
-                               gp_Pnt2d& ,//pE, 
-                               gp_Vec2d& d1E) const
-{
-  TopLoc_Location Loc;
-  Standard_Real parE, fiE, laE, u, v;
-  
-  parE = BRep_Tool::Parameter(V,E);
-   
-  Handle(Geom_Curve) CE = BRep_Tool::Curve(E, Loc, fiE, laE);
-  CE = Handle(Geom_Curve)::DownCast(CE->Transformed(Loc.Transformation()));
-  
-  gp_Pnt p3dE; gp_Vec d3dE;
-  CE->D1(parE, p3dE, d3dE);
-  
-  Handle(Geom_Surface) S = BRep_Tool::Surface(F);
-  GeomAPI_ProjectPointOnSurf proj(p3dE,S);
-  proj.LowerDistanceParameters(u,v);
-  gp_Pnt bid; 
-  gp_Vec d1u,d1v;
-  S->D1(u,v,bid,d1u,d1v);
-  u = d3dE.Dot(d1u);
-  v = d3dE.Dot(d1v);
-  d1E.SetCoord(u,v);
-}
-
-//=======================================================================
-//function : IsClosed
-//purpose  : 
-//=======================================================================
-  Standard_Boolean BOP_WireEdgeSet::IsClosed(const TopoDS_Shape& E) const
-{
-  const TopoDS_Edge& EE = TopoDS::Edge(E);
-  Standard_Boolean closed = BRep_Tool::IsClosed(EE,myFace);
-
-  // modified by NIZHNY-MKK  Wed May 12 15:44:10 2004.BEGIN
-  if(closed) {
-    TopoDS_Edge aE1, aE2;
-    BOPTools_Tools3D::GetSeam (myFace, aE1, aE2);
-
-    if(aE1.IsNull() || aE2.IsNull()) {
-      closed = Standard_False;
-    }
-  }
-  // modified by NIZHNY-MKK  Wed May 12 15:44:14 2004.END
-
-  return closed;
-}
-
-//=======================================================================
-//function : IsUVISO
-//purpose  : 
-//=======================================================================
-  void BOP_WireEdgeSet::IsUVISO(const TopoDS_Edge& E,
-                               const TopoDS_Face& F,
-                               Standard_Boolean& uiso,
-                               Standard_Boolean& viso) 
-{
-  uiso = viso = Standard_False;
-  Standard_Real fE, lE,tolpc;
-  
-  Handle(Geom2d_Curve) PC;
-  BOPTools_Tools2D::CurveOnSurface (E, F, PC, fE, lE, tolpc, Standard_False);//
-  
-  if (PC.IsNull()) {
-    Standard_ProgramError::Raise("BOP_WireEdgeSet::IsUVISO");
-  }
-  
-  Handle(Standard_Type) TheType = PC->DynamicType();
-  if (TheType == STANDARD_TYPE(Geom2d_Line)) {
-    const Handle(Geom2d_Line)& HL = *((Handle(Geom2d_Line)*)&PC);
-    const gp_Dir2d&  D = HL->Direction();
-    Standard_Real    tol = Precision::Angular();
-    if      (D.IsParallel(gp_Dir2d(0.,1.),tol)) {
-      uiso = Standard_True;
-    }    
-    else if (D.IsParallel(gp_Dir2d(1.,0.),tol)) {
-      viso = Standard_True;
-    }
-  }
-}
-
-//=======================================================================
-//function : IsUClosed
-//purpose  : 
-//=======================================================================
-  Standard_Boolean BOP_WireEdgeSet::IsUClosed(const TopoDS_Shape& E) const
-{
-  const TopoDS_Edge& EE = TopoDS::Edge(E);
-
-  Standard_Boolean bid, closed;
-  IsUVISO(EE, myFace, closed, bid);
-  return closed;
-}
-
-
-//=======================================================================
-//function : IsVClosed
-//purpose  : 
-//=======================================================================
-  Standard_Boolean BOP_WireEdgeSet::IsVClosed(const TopoDS_Shape& E) const
-{
-  const TopoDS_Edge& EE = TopoDS::Edge(E);
-
-  Standard_Boolean bid, closed;
-  IsUVISO (EE, myFace, bid, closed);
-  return closed;
-}
-
-//=======================================================================
-//function : Face
-//purpose  : 
-//=======================================================================
-  const TopoDS_Face& BOP_WireEdgeSet::Face() const 
-{
-  return myFace;
-}
-//=======================================================================
-//function : BOP_Tools::KeptTwice
-//purpose  : 
-//=======================================================================
-  Standard_Boolean BOP_WireEdgeSet::KeptTwice (const TopoDS_Edge& aSpEF2) const
-                                        
-
-{
-  Standard_Integer iCnt=0;
-
-  const TopTools_ListOfShape& aWESList=StartElements();
-
-  TopTools_ListIteratorOfListOfShape anIt(aWESList);
-  for (; anIt.More(); anIt.Next()) {
-    const TopoDS_Shape& aSS=anIt.Value();
-    if (aSpEF2.IsSame(aSS)) {
-      iCnt++;
-      if (iCnt > 1) {
-       return Standard_True;
-      }
-    }
-  }
- return Standard_False;
-}
-//=======================================================================
-//function : BOP_Tools::RemoveEdgeFromWES
-//purpose  : 
-//=======================================================================
-  void BOP_WireEdgeSet::RemoveEdgeFromWES(const TopoDS_Edge& aSpEF2)
-                                   
-{
-  TopTools_ListOfShape aTmpList;
-  aTmpList=StartElements();
-  
-  ClearContents();
-
-  TopTools_ListIteratorOfListOfShape anIt(aTmpList);
-  for (; anIt.More(); anIt.Next()) {
-    const TopoDS_Shape& aSS=anIt.Value();
-    if (!aSpEF2.IsEqual(aSS)) {
-      AddStartElement(aSS);
-    }
-  }
-}
-
-
-// modified by NIZHNY-MKK  Fri May 30 10:18:38 2003.BEGIN
-void GetOrientationVOnE(const TopoDS_Shape& V,
-                       const TopoDS_Shape& E1,
-                       const TopoDS_Shape& E2,
-                       TopAbs_Orientation& o1,
-                       TopAbs_Orientation& o2) {
-  TopTools_IndexedMapOfShape aMap;
-
-  TopExp::MapShapes(E1, TopAbs_VERTEX, aMap);
-  TopExp::MapShapes(E2, TopAbs_VERTEX, aMap);
-
-  if(aMap.Extent() > 1) {
-    TopExp_Explorer ex1, ex2;
-    ex1.Init(E1,TopAbs_VERTEX);
-
-    for(; ex1.More(); ex1.Next()) {
-    
-      if (V.IsSame(ex1.Current())) {
-       ex2.Init(E2,TopAbs_VERTEX);
-
-       for(; ex2.More(); ex2.Next()) {
-
-         if (V.IsSame(ex2.Current())) {
-           o1 = ex1.Current().Orientation();
-           o2 = ex2.Current().Orientation();
-
-           if ( o1 != o2 ) {
-             return;
-           }
-         }
-       }
-      }
-    }
-  }
-  else {
-    TopoDS_Shape VV = V;
-
-    if(E1.Orientation() == TopAbs_REVERSED)
-      VV.Reverse();
-    o1 = VV.Orientation();
-    VV.Reverse();
-    o2 = VV.Orientation();
-  }
-  return;
-}
-// modified by NIZHNY-MKK  Fri May 30 10:18:40 2003.END