]> SALOME platform Git repositories - plugins/netgenplugin.git/commitdiff
Salome HOME
Correct netgen patch (remove wrongly added .orig files) V5_1_5rc2
authorvsr <vsr@opencascade.com>
Mon, 15 Nov 2010 09:55:06 +0000 (09:55 +0000)
committervsr <vsr@opencascade.com>
Mon, 15 Nov 2010 09:55:06 +0000 (09:55 +0000)
src/NETGEN/netgen45ForSalome.patch

index 46d5b14beb0149ab5d51415329522f34efbf5965..9c50eaec8c5af5043168e4908552778b2e66a4bb 100644 (file)
@@ -476,687 +476,6 @@ diff -Naur --exclude=CVS netgen-4.5_orig/libsrc/occ/Partition_Inter2d.cxx netgen
  #include <BRepAdaptor_Curve.hxx>
  #include <BRepAlgo_AsDes.hxx>
  #include <BRepLib_MakeVertex.hxx>
-diff -Naur --exclude=CVS netgen-4.5_orig/libsrc/occ/Partition_Inter2d.cxx.orig netgen-4.5_new/libsrc/occ/Partition_Inter2d.cxx.orig
---- netgen-4.5_orig/libsrc/occ/Partition_Inter2d.cxx.orig      1970-01-01 03:00:00.000000000 +0300
-+++ netgen-4.5_new/libsrc/occ/Partition_Inter2d.cxx.orig       2010-06-23 13:19:48.000000000 +0400
-@@ -0,0 +1,677 @@
-+#ifdef OCCGEOMETRY
-+
-+//  GEOM PARTITION : partition algorithm
-+//
-+//  Copyright (C) 2003  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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-+//
-+//
-+//
-+//  File   : Partition_Inter2d.cxx
-+//  Author : Benedicte MARTIN
-+//  Module : GEOM
-+//  $Header$
-+
-+//using namespace std;
-+#include "Partition_Inter2d.ixx"
-+
-+#include "utilities.h"
-+
-+#include <BRepAdaptor_Curve.hxx>
-+#include <BRepAlgo_AsDes.hxx>
-+#include <BRepLib_MakeVertex.hxx>
-+#include <BRep_Builder.hxx>
-+#include <BRep_Tool.hxx>
-+#include <Geom_Surface.hxx>
-+#include <Precision.hxx>
-+#include <TopExp.hxx>
-+#include <TopExp_Explorer.hxx>
-+#include <TopOpeBRepDS_Transition.hxx>
-+#include <TopOpeBRep_EdgesIntersector.hxx>
-+#include <TopOpeBRep_Point2d.hxx>
-+#include <TopTools_ListIteratorOfListOfShape.hxx>
-+#include <TopTools_ListOfShape.hxx>
-+#include <TopTools_MapIteratorOfMapOfShape.hxx>
-+#include <TopTools_MapOfShape.hxx>
-+#include <TopoDS.hxx>
-+#include <TopoDS_Edge.hxx>
-+#include <TopoDS_Vertex.hxx>
-+#include <gp_Pnt.hxx>
-+
-+#ifdef DEB
-+static Standard_Boolean TestEdges = 0;
-+static Standard_Integer NbF2d = 0;
-+static Standard_Integer NbE2d = 0;
-+#endif
-+
-+//=======================================================================
-+//function : getOtherShape
-+//purpose  :
-+//=======================================================================
-+
-+static TopoDS_Shape getOtherShape(const TopoDS_Shape&         theS,
-+                                  const TopTools_ListOfShape& theSList)
-+{
-+  TopTools_ListIteratorOfListOfShape anIt( theSList );
-+  for ( ; anIt.More(); anIt.Next() )
-+    if (!theS.IsSame( anIt.Value() ))
-+      return anIt.Value();
-+
-+  return TopoDS_Shape();
-+}
-+
-+//=======================================================================
-+//function : findVOnE
-+//purpose  : on theE, find a vertex close to theV, such that an edge
-+//           passing through it is an itersection of theF1 and theF2.
-+//           theE intersects theE2 at theV
-+//=======================================================================
-+
-+static Standard_Boolean findVOnE(const TopoDS_Vertex &         theV,
-+                                 const TopoDS_Edge&            theE,
-+                                 const TopoDS_Edge&            theE2,
-+                                 const TopoDS_Shape&           theF1,
-+                                 const TopoDS_Shape&           theF2,
-+                                 const Handle(BRepAlgo_AsDes)& theAsDes,
-+                                 TopoDS_Vertex &               theFoundV)
-+{
-+  Standard_Real MinDist2 = ::RealLast();
-+  gp_Pnt P;
-+
-+  // check all vertices on theE
-+  const TopTools_ListOfShape& aVList = theAsDes->Descendant( theE );
-+  TopTools_ListIteratorOfListOfShape anIt( aVList );
-+  if (anIt.More())
-+    P = BRep_Tool::Pnt( theV );
-+  for ( ; anIt.More(); anIt.Next() )
-+  {
-+    // check by distance
-+    TopoDS_Vertex & V = TopoDS::Vertex( anIt.Value() );
-+    Standard_Real dist2 = P.SquareDistance( BRep_Tool::Pnt( V ));
-+    if (dist2 < MinDist2)
-+      MinDist2 = dist2;
-+    else
-+      continue;
-+
-+    // V is a candidate if among edges passing through V there is one
-+    // which is an intersection of theF1 and theF2
-+    TopTools_ListIteratorOfListOfShape anEIt( theAsDes->Ascendant( V ));
-+    Standard_Boolean isOk = Standard_False;
-+    for (  ; !isOk && anEIt.More(); anEIt.Next() )
-+    {
-+      const TopoDS_Shape & E2 = anEIt.Value();
-+      if ( theE2.IsSame( E2 ))
-+        continue;
-+      const TopTools_ListOfShape & aFList = theAsDes->Ascendant( E2 );
-+      if (aFList.IsEmpty())
-+        continue;
-+      if ( theF1.IsSame( aFList.First() ))
-+        isOk = theF2.IsSame( aFList.Last() );
-+      else
-+        isOk = theF2.IsSame( aFList.First() ) && theF1.IsSame( aFList.Last() );
-+    }
-+    if (isOk)
-+      theFoundV = V;
-+  }
-+
-+  if (theFoundV.IsNull())
-+    return Standard_False;
-+
-+  // check that MinDist2 is not too large
-+  Standard_Real f, l;
-+  TopLoc_Location L;
-+  Handle(Geom_Curve) aCurve = BRep_Tool::Curve( theE, L, f, l );
-+  gp_Pnt P1 = aCurve->Value( f );
-+  gp_Pnt P2 = aCurve->Value( 0.3 * f + 0.7 * l );
-+  //gp_Pnt P2 = aCurve->Value( 0.5 * ( f + l ));
-+  if (MinDist2 > P1.SquareDistance( P2 ))
-+    return Standard_False;
-+
-+#ifdef DEB
-+  MESSAGE("findVOnE: found MinDist = " << sqrt (MinDist2));
-+#endif
-+
-+  return Standard_True;
-+}
-+
-+//=======================================================================
-+//function : AddVonE
-+//purpose  : Put V in AsDes as intersection of E1 and E2.
-+//           Check that vertex equal to V already exists on one
-+//           of edges, in  such  a  case,  V  is  not added but
-+//           existing vertex is updated to  be on E1 and E2 and
-+//           is returned insead of V.
-+//=======================================================================
-+
-+TopoDS_Vertex Partition_Inter2d::AddVonE(const TopoDS_Vertex& theV,
-+                                         const TopoDS_Edge&   E1,
-+                                         const TopoDS_Edge&   E2,
-+                                         const Handle(BRepAlgo_AsDes)& AsDes,
-+                                         const TopoDS_Face&   theF)
-+
-+{
-+  //-------------------------------------------------------------
-+  // test if the points of intersection already exist. If not,
-+  // add as descendants of the edges.
-+  // nb: theses points are only vertices of intersection.
-+  //-------------------------------------------------------------
-+  const TopTools_ListOfShape& VOnE1 = AsDes->Descendant(E1);
-+  const TopTools_ListOfShape& VOnE2 = AsDes->Descendant(E2);
-+  gp_Pnt                      P1,P2;
-+  TopoDS_Vertex               V1,V2;
-+  TopTools_ListIteratorOfListOfShape it;
-+  BRep_Builder                       B;
-+  TopAbs_Orientation                 O1,O2;
-+  Standard_Real                      U1,U2;
-+  Standard_Real                      Tol,Tol1,Tol2;
-+  Standard_Boolean                   OnE1,OnE2;
-+
-+  TopoDS_Vertex V    = theV;
-+
-+  U1 = BRep_Tool::Parameter(V,E1);
-+  U2 = BRep_Tool::Parameter(V,E2);
-+  O1 = V.Orientation();
-+  O2 = O1;
-+  P1  = BRep_Tool::Pnt(V);
-+  Tol = BRep_Tool::Tolerance( V );
-+  OnE1 = OnE2 = Standard_False;
-+
-+  //-----------------------------------------------------------------
-+  // Search if the point of intersection is a vertex of E1.
-+  //-----------------------------------------------------------------
-+  for (it.Initialize(VOnE1); it.More(); it.Next()) {
-+    const TopoDS_Vertex& CV = TopoDS::Vertex( it.Value() );
-+    if (V.IsSame( CV )) {
-+      V1   = V;
-+      OnE1 = Standard_True;
-+      break;
-+    }
-+    P2 = BRep_Tool::Pnt( CV );
-+    Tol1 = 1.1*(Tol + BRep_Tool::Tolerance( CV ));
-+    if (P1.SquareDistance(P2) <= Tol1*Tol1) {
-+      V    = CV;
-+      V1   = V;
-+      OnE1 = Standard_True;
-+      break;
-+    }
-+  }
-+  if (OnE1) {
-+    //-----------------------------------------------------------------
-+    // Search if the vertex found is still on E2.
-+    //-----------------------------------------------------------------
-+    for (it.Initialize(VOnE2); it.More(); it.Next()) {
-+      if (V.IsSame( it.Value() )) {
-+        OnE2 = Standard_True;
-+        V2   = V;
-+        break;
-+      }
-+    }
-+  }
-+  if (!OnE2) {
-+    for (it.Initialize(VOnE2); it.More(); it.Next()) {
-+      //-----------------------------------------------------------------
-+      // Search if the point of intersection is a vertex of E2.
-+      //-----------------------------------------------------------------
-+      const TopoDS_Vertex& CV = TopoDS::Vertex( it.Value() );
-+      P2 = BRep_Tool::Pnt( CV );
-+      Tol2 = 1.1*(Tol + BRep_Tool::Tolerance( CV ));
-+      if (P1.SquareDistance(P2) <= Tol2*Tol2) {
-+        V  = CV;
-+        V2 = V;
-+        OnE2 = Standard_True;
-+        break;
-+      }
-+    }
-+  }
-+
-+
-+  if (!OnE1 && !OnE2 && !theF.IsNull())
-+  {
-+    // if 3 faces intersects each others, 3 new edges on them must pass
-+    // through one vertex but real intersection points of each
-+    // pair of edges are sometimes more far than a tolerance.
-+    // Try to analitically find vertices that E1 and E2 must pass trough
-+
-+    TopoDS_Shape F1 = getOtherShape( theF, AsDes->Ascendant( E1 ));
-+    TopoDS_Shape F2 = getOtherShape( theF, AsDes->Ascendant( E2 ));
-+    if (!F1.IsNull() && !F2.IsNull() && !F1.IsSame( F2 ))
-+    {
-+      OnE1 = findVOnE ( theV, E1, E2, F1, F2, AsDes, V1 );
-+      OnE2 = findVOnE ( theV, E2, E1, F1, F2, AsDes, V2 );
-+      if (OnE2) V = V2;
-+      if (OnE1) V = V1;
-+    }
-+  }
-+
-+  if (OnE1 && OnE2) {
-+    if (!V1.IsSame(V2)) {
-+      // replace V1 with V2 on all edges V1 is on
-+      Standard_Real UV1;
-+      TopoDS_Edge   EWE1;
-+      TopoDS_Vertex VI;
-+      const TopTools_ListOfShape& EdgeWithV1 = AsDes->Ascendant(V1);
-+
-+      for (it.Initialize(EdgeWithV1); it.More(); it.Next()) {
-+        EWE1  = TopoDS::Edge(it.Value());
-+        VI = V1;
-+        VI.Orientation(TopAbs_INTERNAL);
-+        UV1 = BRep_Tool::Parameter(VI,EWE1);
-+        VI = V2;
-+        VI.Orientation(TopAbs_INTERNAL);
-+        B.UpdateVertex( VI, UV1, EWE1, GetTolerance( VI, UV1, EWE1, AsDes));
-+      }
-+      AsDes->Replace(V1,V2);
-+      V = V2;
-+    }
-+  }
-+
-+  // add existing vertices instead of new ones
-+  if (!OnE1) {
-+    if (OnE2) {
-+      V.Orientation(TopAbs_INTERNAL);
-+      B.UpdateVertex (V, U1, E1, GetTolerance( V, U1, E1, AsDes));
-+    }
-+    V.Orientation(O1);
-+    AsDes->Add(E1,V);
-+  }
-+  if (!OnE2) {
-+    if (OnE1) {
-+      V.Orientation(TopAbs_INTERNAL);
-+      B.UpdateVertex (V, U2, E2, GetTolerance( V, U2, E2, AsDes ));
-+    }
-+    V.Orientation(O2);
-+    AsDes->Add(E2,V);
-+  }
-+
-+  return V;
-+}
-+
-+//=======================================================================
-+//function : FindEndVertex
-+//purpose  : Returns a vertex  from  <VertList> having parameter on
-+//           <E>  closest  to  <f>  or  <l>.  <isFirst>  is True if
-+//           found vertex is closer  to <f>. <DU> returns parameter
-+//           difference.
-+//=======================================================================
-+
-+TopoDS_Vertex Partition_Inter2d::FindEndVertex(const TopTools_ListOfShape& LV,
-+                                               const Standard_Real f,
-+                                               const Standard_Real l,
-+                                               const TopoDS_Edge&  E,
-+                                               Standard_Boolean&   isFirst,
-+                                               Standard_Real&      minDU)
-+{
-+  TopoDS_Vertex endV;
-+  Standard_Real U, endU, min;
-+  minDU = 1.e10;
-+
-+  TopTools_ListIteratorOfListOfShape it;
-+  it.Initialize(LV);
-+  for (; it.More(); it.Next()) {
-+    const TopoDS_Vertex& v = TopoDS::Vertex(it.Value());
-+    U = BRep_Tool::Parameter(v, E);
-+    min = Min( Abs(U-f), Abs(U-l) );
-+    if (min < minDU) {
-+      endV = v;
-+      endU = U;
-+      minDU = min;
-+    }
-+  }
-+  if (Abs(endU-f) < Abs(endU-l))
-+    isFirst = Standard_True;
-+  else
-+    isFirst = Standard_False;
-+
-+  return endV;
-+}
-+
-+//=======================================================================
-+//function : treatClosed
-+//purpose  : add second vertex to closed edge. Vertex is one of <LV1>
-+//=======================================================================
-+
-+static void treatClosed (const TopoDS_Edge& E1,
-+                          const Standard_Real f,
-+                          const Standard_Real l,
-+                          TopTools_ListOfShape& LV1,
-+                          TopTools_ListOfShape& /*LV2*/)
-+{
-+  Standard_Boolean isFirst=0;
-+  Standard_Real    minDU = 1.e10;
-+  TopoDS_Vertex endV;
-+  endV = Partition_Inter2d::FindEndVertex(LV1, f,l, E1, isFirst,minDU);
-+
-+  if (minDU > Precision::PConfusion())
-+    return; // not end point
-+
-+  Standard_Real newU;
-+  if (isFirst)
-+    newU = f + (l - f);
-+  else
-+    newU = l - (l - f);
-+
-+  // update end parameter
-+  BRep_Builder B;
-+  endV.Orientation(TopAbs_INTERNAL);
-+  B.UpdateVertex(endV,newU,E1,BRep_Tool::Tolerance(endV));
-+}
-+
-+//=======================================================================
-+//function : EdgesPartition
-+//purpose  :
-+//=======================================================================
-+
-+static void EdgesPartition(const TopoDS_Face&            F,
-+                           const TopoDS_Edge&            E1,
-+                           const TopoDS_Edge&            E2,
-+                           const Handle(BRepAlgo_AsDes)& AsDes,
-+                           const TopTools_MapOfShape&    NewEdges,
-+                           const Standard_Boolean        WithOri)
-+{
-+
-+  Standard_Real f[3],l[3];
-+  Standard_Real MilTol2;
-+  Standard_Real Tol = Max (BRep_Tool::Tolerance(E1),
-+                           BRep_Tool::Tolerance(E2));
-+  MilTol2 = Tol * Tol * 10;
-+
-+  BRep_Tool::Range(E1, f[1], l[1]);
-+  BRep_Tool::Range(E2, f[2], l[2]);
-+
-+  BRepAdaptor_Curve CE1(E1,F);
-+  BRepAdaptor_Curve CE2(E2,F);
-+
-+  TopoDS_Edge                 EI[3]; EI[1] = E1; EI[2] = E2;
-+  TopTools_ListOfShape        LV1; // new vertices at intersections on E1
-+  TopTools_ListOfShape        LV2; // ... on E2
-+  BRep_Builder                B;
-+
-+  // if E1 and E2 are results of intersection of F and two connex faces then
-+  // no need to intersect edges, they can contact by vertices only
-+  // (encounted an exception in TopOpeBRep_EdgesIntersector in such a case)
-+  Standard_Boolean intersect = Standard_True;
-+  TopTools_IndexedMapOfShape ME;
-+  TopExp::MapShapes(F, TopAbs_EDGE, ME);
-+  if (!ME.Contains(E1) && ! ME.Contains(E2)) { // if E1 and E2 are new on F
-+    TopoDS_Shape F1, F2;
-+    const TopTools_ListOfShape& LF1 = AsDes->Ascendant( E1 );
-+    F1 = F.IsSame( LF1.First() ) ? LF1.Last() : LF1.First();
-+    const TopTools_ListOfShape& LF2 = AsDes->Ascendant( E2 );
-+    F2 = F.IsSame( LF2.First() ) ? LF2.Last() : LF2.First();
-+    if (!F.IsSame(F2) && !F.IsSame(F1) ) {
-+      TopExp_Explorer exp(F2, TopAbs_EDGE);
-+      TopExp::MapShapes(F1, TopAbs_EDGE, ME);
-+      for (; exp.More(); exp.Next()) {
-+        if (ME.Contains( exp.Current())) {
-+          intersect = Standard_False;
-+          break;
-+        }
-+      }
-+    }
-+  }
-+
-+  if (intersect) {
-+    //------------------------------------------------------
-+    // compute the points of Intersection in 2D
-+    //-----------------------------------------------------
-+    // i.e. fill LV1 and LV2
-+    TopOpeBRep_EdgesIntersector EInter;
-+    EInter.SetFaces(F,F);
-+    Standard_Real TolDub = 1.e-7;
-+    EInter.ForceTolerances(TolDub,TolDub);
-+    Standard_Boolean reducesegments = Standard_False;
-+    EInter.Perform (E1,E2,reducesegments);
-+
-+    Standard_Boolean rejectreducedsegmentpoints = Standard_False;
-+    EInter.InitPoint(rejectreducedsegmentpoints);
-+    for ( ; EInter.MorePoint(); EInter.NextPoint() )
-+    {
-+      const TopOpeBRep_Point2d& P2D = EInter.Point();
-+      const gp_Pnt&    P    = P2D.Value();
-+      TopoDS_Vertex    V    = BRepLib_MakeVertex(P);
-+
-+      //-------------------------
-+      // control the point found.
-+      //-------------------------
-+      gp_Pnt P1 = CE1.Value(P2D.Parameter(1));
-+      gp_Pnt P2 = CE2.Value(P2D.Parameter(2));
-+      Standard_Real sqd1 = P1.SquareDistance(P);
-+      Standard_Real sqd2 = P2.SquareDistance(P);
-+      if (sqd1 > MilTol2 || sqd2 > MilTol2  )
-+        continue;
-+
-+      // add a new vertex to the both edges
-+      Standard_Real toler = Max( Tol, sqrt( Max( sqd1, sqd2 )));
-+      Standard_Integer i;
-+      for (i = 1; i <= 2; i++) {
-+        Standard_Real U = P2D.Parameter(i);
-+        V.Orientation(TopAbs_INTERNAL);
-+        B.UpdateVertex( V,U,EI[i], toler);
-+        TopAbs_Orientation OO = TopAbs_REVERSED;
-+        if (WithOri) {
-+          if (P2D.IsVertex(i))
-+            OO = P2D.Vertex(i).Orientation();
-+          else if (P2D.Transition(i).Before() == TopAbs_OUT) {
-+            OO = TopAbs_FORWARD;
-+          }
-+          V.Orientation(OO);
-+          if (i == 1) LV1.Append(V);
-+          else        LV2.Append(V);
-+        }
-+      }
-+    }
-+  } // if (intersect)
-+
-+  //----------------------------------
-+  // Test the extremities of the edges.
-+  //----------------------------------
-+  // add to LV* vertices for vertex-vertex closeness
-+  Standard_Real U1,U2;
-+  Standard_Real TolConf2, TolConf;
-+  TopoDS_Vertex V1[2],V2[2];
-+  TopExp::Vertices(E1,V1[0],V1[1]);
-+  TopExp::Vertices(E2,V2[0],V2[1]);
-+
-+  Standard_Integer i,j,k;
-+  for (j = 0; j < 2; j++) {
-+    if (V1[j].IsNull()) continue;
-+    for ( k = 0; k < 2; k++) {
-+      if (V2[k].IsNull()) continue;
-+      gp_Pnt P1 = BRep_Tool::Pnt(V1[j]);
-+      gp_Pnt P2 = BRep_Tool::Pnt(V2[k]);
-+      TolConf = BRep_Tool::Tolerance(V1[j]) + BRep_Tool::Tolerance(V2[k]);
-+      TolConf = Max (Tol, TolConf);
-+      TolConf2 = TolConf * TolConf;
-+      if (!intersect)
-+        TolConf2 *= 100;
-+      Standard_Real SqDist = P1.SquareDistance(P2);
-+
-+      if (SqDist <= TolConf2) {
-+        TopoDS_Vertex V = BRepLib_MakeVertex(P1);
-+        V.Orientation(TopAbs_INTERNAL);
-+        U1 = (j == 0) ? f[1] : l[1];
-+        U2 = (k == 0) ? f[2] : l[2];
-+        B.UpdateVertex(V,U1,E1,TolConf);
-+        B.UpdateVertex(V,U2,E2,TolConf);
-+        LV1.Prepend(V.Oriented(V1[j].Orientation()));
-+        LV2.Prepend(V.Oriented(V2[k].Orientation()));
-+      }
-+    }
-+  }
-+
-+  Standard_Boolean AffichPurge = Standard_False;
-+
-+  if ( LV1.IsEmpty()) return;
-+
-+  //----------------------------------
-+  // Purge of all the vertices.
-+  //----------------------------------
-+  // remove one of close vertices
-+  TopTools_ListIteratorOfListOfShape it1LV1,it1LV2,it2LV1;
-+  gp_Pnt P1,P2;
-+  Standard_Boolean Purge = Standard_True;
-+
-+  while (Purge) {
-+    i = 1;
-+    Purge = Standard_False;
-+    for (it1LV1.Initialize(LV1),it1LV2.Initialize(LV2);
-+         it1LV1.More();
-+         it1LV1.Next(),it1LV2.Next()) {
-+      j = 1;
-+      it2LV1.Initialize(LV1);
-+      while (j < i) {
-+        const TopoDS_Vertex& VE1 = TopoDS::Vertex(it1LV1.Value());
-+        const TopoDS_Vertex& VE2 = TopoDS::Vertex(it2LV1.Value());
-+        Standard_Real Tol1 = BRep_Tool::Tolerance( VE1 );
-+        Standard_Real Tol2 = BRep_Tool::Tolerance( VE2 );
-+        P1 = BRep_Tool::Pnt( VE1 );
-+        P2 = BRep_Tool::Pnt( VE2 );
-+        if (P1.IsEqual(P2, Tol1 + Tol2)) {
-+          LV1.Remove(it1LV1);
-+          LV2.Remove(it1LV2);
-+          Purge = Standard_True;
-+          break;
-+        }
-+        j++;
-+        it2LV1.Next();
-+      }
-+      if (Purge) break;
-+      i++;
-+    }
-+  }
-+
-+  // care of new closed edges, they always intersect with seam at end
-+  if (V1[0].IsSame( V1[1] ) && NewEdges.Contains(E1) )
-+    treatClosed (E1, f[1], l[1], LV1, LV2);
-+  if (V2[0].IsSame( V2[1] ) && NewEdges.Contains(E2) )
-+    treatClosed (E2, f[2], l[2], LV2, LV1);
-+
-+  //----------------
-+  // Stocking vertex
-+  //----------------
-+
-+  for ( it1LV1.Initialize( LV1 ); it1LV1.More(); it1LV1.Next())
-+    Partition_Inter2d::AddVonE (TopoDS::Vertex( it1LV1.Value()),
-+                                E1, E2, AsDes, F);
-+}
-+
-+//=======================================================================
-+//function : CompletPart2d
-+//purpose  : Computes the intersections between the edges stored
-+//           is AsDes as descendants of <F> . Intersections is computed
-+//           between two edges if one of them is bound in NewEdges.
-+//=======================================================================
-+
-+void Partition_Inter2d::CompletPart2d (const Handle(BRepAlgo_AsDes)&   AsDes,
-+                                       const TopoDS_Face&              F,
-+                                       const TopTools_MapOfShape&      NewEdges)
-+{
-+
-+#ifdef DEB
-+  NbF2d++;
-+  NbE2d = 0;
-+#endif
-+
-+  //Do not intersect the edges of a face
-+  TopTools_IndexedMapOfShape EdgesOfFace;
-+  TopExp::MapShapes( F, TopAbs_EDGE , EdgesOfFace);
-+
-+  //-------------------------------------------------------------------
-+  // compute the intersection2D on the faces touched by the intersection3D
-+  //-------------------------------------------------------------------
-+  TopTools_ListIteratorOfListOfShape it1LE ;
-+  TopTools_ListIteratorOfListOfShape it2LE ;
-+
-+  //-----------------------------------------------
-+  // Intersection edge-edge.
-+  //-----------------------------------------------
-+  const TopTools_ListOfShape&        LE = AsDes->Descendant(F);
-+  TopoDS_Vertex                      V1,V2;
-+  Standard_Integer                   j, i = 1;
-+
-+  TopoDS_Face FF = F;
-+  FF.Orientation(TopAbs_FORWARD);
-+
-+  for ( it1LE.Initialize(LE) ; it1LE.More(); it1LE.Next()) {
-+    const TopoDS_Edge& E1 = TopoDS::Edge(it1LE.Value());
-+    j = 1;
-+    it2LE.Initialize(LE);
-+
-+    while (j < i && it2LE.More()) {
-+      const TopoDS_Edge& E2 = TopoDS::Edge(it2LE.Value());
-+      //----------------------------------------------------------
-+      // Intersections of the new edges obtained by intersection
-+      // between them and with the restrictions edges
-+      //----------------------------------------------------------
-+      if ( (!EdgesOfFace.Contains(E1) || !EdgesOfFace.Contains(E2)) &&
-+           (NewEdges.Contains(E1) || NewEdges.Contains(E2)) ) {
-+        EdgesPartition(FF,E1,E2,AsDes,NewEdges,Standard_True);
-+      }
-+      it2LE.Next();
-+      j++;
-+    }
-+    i++;
-+  }
-+}
-+
-+//=======================================================================
-+//function : GetTolerance
-+//purpose  : Returns  tolerance  theV   must   have  atfer  its
-+//           addition to theE with  theU parameter. theAsDes is
-+//           used to find pcurves of theE
-+//=======================================================================
-+
-+Standard_Real Partition_Inter2d::GetTolerance
-+                         (const TopoDS_Vertex &         theV,
-+                          const Standard_Real           theU,
-+                          const TopoDS_Edge &           theE,
-+                          const Handle(BRepAlgo_AsDes)& theAsDes)
-+{
-+  Standard_Real aTol = BRep_Tool::Tolerance( theV );
-+  gp_Pnt aPnt = BRep_Tool::Pnt( theV );
-+
-+  // check point on 3D curve
-+  Standard_Real f,l;
-+  Handle(Geom_Curve) C = BRep_Tool::Curve( theE, f, l );
-+  if (!C.IsNull())
-+    aTol = Max ( aTol, aPnt.Distance( C->Value( theU )));
-+
-+  // check points on pcurves
-+  const TopTools_ListOfShape& aFList = theAsDes->Ascendant( theE );
-+  TopTools_ListIteratorOfListOfShape aFIt( aFList );
-+  for (  ; aFIt.More(); aFIt.Next() )
-+  {
-+    const TopoDS_Face& F = TopoDS::Face( aFIt.Value() );
-+    Handle(Geom2d_Curve) pcurve = BRep_Tool::CurveOnSurface( theE, F, f, l );
-+    if (!pcurve.IsNull())
-+    {
-+      gp_Pnt2d aPnt2d = pcurve->Value( theU );
-+      TopLoc_Location L;
-+      Handle(Geom_Surface) S = BRep_Tool::Surface( F, L );
-+      gp_Pnt aPntOnS = S->Value( aPnt2d.X(), aPnt2d.Y() );
-+      if (!L.IsIdentity())
-+        aPntOnS.Transform( L.Transformation() );
-+      aTol = Max ( aTol, aPnt.Distance( aPntOnS ));
-+    }
-+  }
-+
-+  return aTol;
-+}
-+
-+#endif
 diff -Naur --exclude=CVS netgen-4.5_orig/libsrc/occ/Partition_Inter3d.cxx netgen-4.5_new/libsrc/occ/Partition_Inter3d.cxx
 --- netgen-4.5_orig/libsrc/occ/Partition_Inter3d.cxx   2005-06-09 18:51:10.000000000 +0400
 +++ netgen-4.5_new/libsrc/occ/Partition_Inter3d.cxx    2010-06-23 13:19:48.000000000 +0400
@@ -1179,4817 +498,78 @@ diff -Naur --exclude=CVS netgen-4.5_orig/libsrc/occ/Partition_Inter3d.cxx netgen
  #include <BRepOffset_Tool.hxx>
  #include <BRep_Builder.hxx>
  #include <BRep_Tool.hxx>
-diff -Naur --exclude=CVS netgen-4.5_orig/libsrc/occ/Partition_Inter3d.cxx.orig netgen-4.5_new/libsrc/occ/Partition_Inter3d.cxx.orig
---- netgen-4.5_orig/libsrc/occ/Partition_Inter3d.cxx.orig      1970-01-01 03:00:00.000000000 +0300
-+++ netgen-4.5_new/libsrc/occ/Partition_Inter3d.cxx.orig       2010-06-23 13:19:48.000000000 +0400
-@@ -0,0 +1,943 @@
-+#ifdef OCCGEOMETRY
-+
-+//  GEOM PARTITION : partition algorithm
-+//
-+//  Copyright (C) 2003  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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
-+//
-+//
-+//
-+//  File   : Partition_Inter3d.cxx
-+//  Author : Benedicte MARTIN
-+//  Module : GEOM
-+//  $Header$
-+
-+//using namespace std;
-+#include "Partition_Inter2d.hxx"
-+#include "Partition_Inter3d.ixx"
-+#include "utilities.h"
-+
-+#include <BRepAlgo_AsDes.hxx>
-+#include <BRepAlgo_Image.hxx>
-+#include <BRepLib.hxx>
-+#include <BRepOffset_Tool.hxx>
-+#include <BRep_Builder.hxx>
-+#include <BRep_Tool.hxx>
-+
-+#include <TopExp.hxx>
-+#include <TopExp_Explorer.hxx>
-+
-+#include <TopOpeBRepTool_BoxSort.hxx>
-+#include <TopTools_DataMapIteratorOfDataMapOfShapeListOfShape.hxx>
-+#include <TopTools_ListIteratorOfListOfShape.hxx>
-+#include <TopTools_ListOfShape.hxx>
-+#include <TopoDS.hxx>
-+#include <TopoDS_Compound.hxx>
-+#include <TopoDS_Edge.hxx>
-+#include <TopoDS_Face.hxx>
-+#include <TopoDS_Vertex.hxx>
-+
-+#ifdef DEB
-+#include <DBRep.hxx>
-+#endif
-+
-+#include <BRepLib_MakeVertex.hxx>
-+#include <BRepTools.hxx>
-+#include <Extrema_ExtPS.hxx>
-+#include <Extrema_POnSurf.hxx>
-+#include <Geom2dAPI_ProjectPointOnCurve.hxx>
-+#include <Geom2d_Curve.hxx>
-+#include <GeomAPI_ProjectPointOnCurve.hxx>
-+#include <GeomAdaptor_Surface.hxx>
-+#include <Geom_Curve.hxx>
-+#include <Geom_RectangularTrimmedSurface.hxx>
-+#include <Geom_SphericalSurface.hxx>
-+#include <Geom_Surface.hxx>
-+#include <Geom_TrimmedCurve.hxx>
-+#include <Precision.hxx>
-+#include <TColStd_MapOfInteger.hxx>
-+#include <TopOpeBRepBuild_Builder.hxx>
-+#include <TopOpeBRepDS_BuildTool.hxx>
-+#include <TopOpeBRepDS_CurveExplorer.hxx>
-+#include <TopOpeBRepDS_HDataStructure.hxx>
-+#include <TopOpeBRepDS_Interference.hxx>
-+#include <TopOpeBRepDS_PointIterator.hxx>
-+#include <TopOpeBRepDS_Transition.hxx>
-+#include <TopOpeBRepTool_CurveTool.hxx>
-+#include <TopOpeBRepTool_GeomTool.hxx>
-+#include <TopOpeBRepTool_OutCurveType.hxx>
-+#include <TopOpeBRep_DSFiller.hxx>
-+#include <TopTools_DataMapIteratorOfDataMapOfShapeShape.hxx>
+diff -Naur --exclude=CVS netgen-4.5_orig/libsrc/occ/Partition_Loop.cxx netgen-4.5_new/libsrc/occ/Partition_Loop.cxx
+--- netgen-4.5_orig/libsrc/occ/Partition_Loop.cxx      2005-06-09 18:51:10.000000000 +0400
++++ netgen-4.5_new/libsrc/occ/Partition_Loop.cxx       2010-06-23 13:19:48.000000000 +0400
+@@ -29,12 +29,14 @@
+ //  $Header$
+ //using namespace std;
+-#include <stdio.h>
+-#include "Partition_Loop.ixx"
+ #include "utilities.h"
 +#include <stdio.h>
 +
-+//=======================================================================
-+//function : Partition_Inter3d
-+//purpose  : 
-+//=======================================================================
-+
-+Partition_Inter3d::Partition_Inter3d()
-+{
-+}
-+//=======================================================================
-+//function : Partition_Inter3d
-+//purpose  : 
-+//=======================================================================
-+
-+Partition_Inter3d::Partition_Inter3d(const Handle(BRepAlgo_AsDes)& AsDes)
-+  :myAsDes(AsDes)
-+{
-+  mySectionEdgesAD = new BRepAlgo_AsDes;
-+}
-+
-+//=======================================================================
-+//function : CompletPart3d
-+//purpose  : FaceShapeMap is just to know the shape a face belongs to
-+//=======================================================================
-+
-+void Partition_Inter3d::CompletPart3d(const TopTools_ListOfShape& SetOfFaces1,
-+                                    const TopTools_DataMapOfShapeShape& FaceShapeMap)
-+{
-+  if (myAsDes.IsNull())
-+    myAsDes = new BRepAlgo_AsDes;
-+  
-+  TopTools_ListIteratorOfListOfShape it;
-+
-+  //---------------------------------------------------------------
-+  // Construction of bounding boxes.
-+  //---------------------------------------------------------------
-+
-+  BRep_Builder B;
-+  TopoDS_Compound CompOS;
-+  B.MakeCompound(CompOS);
-+  for (it.Initialize(SetOfFaces1); it.More(); it.Next())
-+    B.Add(CompOS, it.Value());
-+    
-+  TopOpeBRepTool_BoxSort BOS;
-+  BOS.AddBoxesMakeCOB(CompOS,TopAbs_FACE);
-+
-+  for (it.Initialize(SetOfFaces1); it.More(); it.Next()) {
-+    TopoDS_Face F1 = TopoDS::Face(it.Value());
-+    
-+    // avoid intersecting faces of one shape
-+    TopoDS_Shape S1;
-+    if (FaceShapeMap.IsBound(F1)) S1 = FaceShapeMap.Find(F1);
-+
-+    // to filter faces sharing an edge
-+    TopTools_IndexedMapOfShape EM;
-+    TopExp::MapShapes( F1, TopAbs_EDGE, EM);
-+    
-+    TColStd_ListIteratorOfListOfInteger itLI = BOS.Compare(F1);
-+    for (; itLI.More(); itLI.Next()) {
-+      TopoDS_Face F2 = TopoDS::Face(BOS.TouchedShape(itLI));
-+      if (F1.IsSame(F2) || IsDone(F1,F2))
-+      continue;
-+
-+      TopoDS_Shape S2;
-+      if (FaceShapeMap.IsBound(F2)) S2 = FaceShapeMap.Find(F2);
-+      if (!S1.IsNull() && S1.IsSame(S2))
-+      continue; // descendants of one shape
-+
-+      TopExp_Explorer expE (F2, TopAbs_EDGE);
-+      for ( ; expE.More(); expE.Next())
-+      if (EM.Contains( expE.Current() ))
-+        break;
-+      if (expE.More())
-+      {
-+        // faces have a common edge, check if they are a tool and a face
-+        // generated by the tool in another shape; in that case they are
-+        // to be intersected
-+        TopLoc_Location L1, L2;
-+        Handle(Geom_Surface) S1 = BRep_Tool::Surface( F1, L1 );
-+        Handle(Geom_Surface) S2 = BRep_Tool::Surface( F2, L2 );
-+        if ( S1 != S2 || L1 != L2 )
-+          continue;
-+      }
-+
-+      F1.Orientation(TopAbs_FORWARD);
-+      F2.Orientation(TopAbs_FORWARD);
-+      FacesPartition(F1,F2);    
-+    }
-+
-+    // mark as modified a face which has at least one new edge
-+    if (!myAsDes->HasDescendant( F1 ))
-+      continue;
-+    TopTools_ListIteratorOfListOfShape itE (myAsDes->Descendant( F1 ));
-+    for ( ; itE.More(); itE.Next()) {
-+      if (myNewEdges.Contains( itE.Value())) {
-+      myTouched.Add( F1 );
-+      break;
-+      }
-+    }
-+  }
-+}
-+
-+//=======================================================================
-+//function : PutInBounds
-+//purpose  : 
-+//=======================================================================
-+
-+static void PutInBounds (const TopoDS_Face&          F,
-+                       const TopoDS_Edge&          E,
-+                       Handle(Geom2d_Curve)&       C2d)
-+{
-+  Standard_Real   umin,umax,vmin,vmax;
-+  Standard_Real   f,l;
-+  BRep_Tool::Range(E,f,l);
-+
-+  TopLoc_Location L; // Recup S avec la location pour eviter la copie.
-+  Handle (Geom_Surface) S   = BRep_Tool::Surface(F,L);
-+
-+  if (S->IsKind(STANDARD_TYPE(Geom_RectangularTrimmedSurface))) {
-+    S = (*(Handle_Geom_RectangularTrimmedSurface*)&S)->BasisSurface();
-+  }
-+  if (!S->IsUPeriodic() && !S->IsVPeriodic())
-+    return;
-+
-+  BRepTools::UVBounds(F,umin,umax,vmin,vmax);
-+
-+  gp_Pnt2d Pf = C2d->Value(f);
-+  gp_Pnt2d Pl = C2d->Value(l);
-+  const Standard_Real Um = 0.34*f + 0.66*l;
-+  gp_Pnt2d Pm = C2d->Value( Um );
-+
-+  // sometimes on shpere, pcurve is out of domain by V though S is
-+  // UPeriodic, sometimes it is in domain but nontheless it has
-+  // wrong position.
-+  // Check pcurve position by 3D point
-+  if (S->IsKind(STANDARD_TYPE( Geom_SphericalSurface )))
-+  {
-+    // get point on the surface
-+    gp_Pnt Ps = S->Value( Pm.X(), Pm.Y() );
-+    // get point on the edge
-+    Handle(Geom_Curve) C = BRep_Tool::Curve( E, f, l );
-+    gp_Pnt Pc = C->Value( Um );
-+    // compare points
-+    Standard_Real TolE = BRep_Tool::Tolerance( E );
-+    if ( Pc.SquareDistance( Ps ) * 0.95 < TolE * TolE )
-+      return; // OK
-+
-+    // find good UV for Pc: project Pc on S
-+    GeomAdaptor_Surface  SA (S);
-+    Extrema_ExtPS anExtPS (Pc, SA,
-+                           SA.UResolution( TolE ), SA.VResolution( TolE ));
-+    if (anExtPS.IsDone())
-+    {
-+      Standard_Integer i, nbExt = anExtPS.NbExt();
-+      Extrema_POnSurf aPOnSurf;
-+      for (i = 1; i <= nbExt; ++i )
-+        if (anExtPS.Value( i ) <= TolE) {
-+          aPOnSurf = anExtPS.Point( i );
-+          break;
-+        }
-+      if (i <= nbExt) {
-+        // a point found
-+        Standard_Real u, v;
-+        aPOnSurf.Parameter( u, v );
-+        gp_Pnt2d aGoodPm ( u, v );
-+        C2d->Translate( Pm , aGoodPm );
-+      }
-+    }
-+  }
-+
-+  //---------------
-+  // Recadre en U.
-+  //---------------
-+  if (S->IsUPeriodic()) {
-+    Standard_Real period  = S->UPeriod();
-+    Standard_Real eps     = period*1.e-6;
-+    Standard_Real minC    = Min(Pf.X(),Pl.X()); minC = Min(minC,Pm.X());
-+    Standard_Real maxC    = Max(Pf.X(),Pl.X()); maxC = Max(maxC,Pm.X());
-+    Standard_Real du = 0.;
-+    if (minC< umin - eps) {
-+      du = (int((umin - minC)/period) + 1)*period;
-+    }
-+    if (minC > umax + eps) {
-+      du = -(int((minC - umax)/period) + 1)*period;
-+    }
-+    if (du != 0) {
-+      gp_Vec2d T1(du,0.);
-+      C2d->Translate(T1);
-+      minC += du; maxC += du;
-+    }
-+    // Ajuste au mieux la courbe dans le domaine.
-+    if (maxC > umax +100*eps) {
-+      Standard_Real d1 = maxC - umax;
-+      Standard_Real d2 = umin - minC + period;
-+      if (d2 < d1) du =-period;
-+      if ( du != 0.) {
-+      gp_Vec2d T2(du,0.);
-+      C2d->Translate(T2);
-+      }
-+    }
-+  }
-+  //------------------
-+  // Recadre en V.
-+  //------------------
-+  if (S->IsVPeriodic()) {
-+    Standard_Real period  = S->VPeriod();
-+    Standard_Real eps     = period*1.e-6;
-+    Standard_Real minC    = Min(Pf.Y(),Pl.Y()); minC = Min(minC,Pm.Y());
-+    Standard_Real maxC    = Max(Pf.Y(),Pl.Y()); maxC = Max(maxC,Pm.Y());
-+    Standard_Real dv = 0.;
-+    if (minC< vmin - eps) {
-+      dv = (int((vmin - minC)/period) + 1)*period;
-+    }
-+    if (minC > vmax + eps) {
-+      dv = -(int((minC - vmax)/period) + 1)*period;
-+    }
-+    if (dv != 0) {
-+      gp_Vec2d T1(0.,dv);
-+      C2d->Translate(T1);
-+      minC += dv; maxC += dv;
-+    }
-+    // Ajuste au mieux la courbe dans le domaine.
-+    if (maxC > vmax +100*eps) {
-+      Standard_Real d1 = maxC - vmax;
-+      Standard_Real d2 = vmin - minC + period;
-+      if (d2 < d1) dv =-period;
-+      if ( dv != 0.) {
-+      gp_Vec2d T2(0.,dv);
-+      C2d->Translate(T2);
-+      }
-+    }
-+  }
-+}
-+
-+//=======================================================================
-+//function : Inter3D
-+//purpose  : 
-+//=======================================================================
-+
-+void Partition_Inter3d::Inter3D(const TopoDS_Face& F1,
-+                              const TopoDS_Face& F2,
-+                              TopTools_ListOfShape& L)
-+{
-+  BRep_Builder B;
-+  
-+  // fill the data Structure
-+  Handle(TopOpeBRepDS_HDataStructure) DatStr = new TopOpeBRepDS_HDataStructure();
-+  TopOpeBRep_DSFiller DSFiller;
-+  DSFiller.Insert(F1,F2,DatStr);
-+
-+  // define the GeomTool used by the DSFiller :
-+  // compute BSpline of degree 1 on intersection curves.
-+  Standard_Real tol3dAPPROX = 1e-7;
-+  Standard_Real tol2dAPPROX = 1e-7;
-+  TopOpeBRepTool_GeomTool GT2 (TopOpeBRepTool_APPROX);  
-+  GT2.SetTolerances(tol3dAPPROX,tol2dAPPROX);
-+  TopOpeBRepDS_BuildTool  BT(GT2);
-+
-+  // Perform Section
-+  TopOpeBRepBuild_Builder TopB(BT);
-+  TopB.Perform(DatStr);
-+
-+  // ===============
-+  // Store new edges
-+  // ===============
-+  
-+  L.Clear();
-+  TopOpeBRepDS_CurveExplorer cex(DatStr->DS());
-+  for (; cex.More(); cex.Next()) {
-+    const TopOpeBRepDS_Curve& CDS = cex.Curve();
-+    Standard_Integer ic = cex.Index();
-+    Handle(Geom2d_Curve) pc1 = CDS.Curve1();
-+    Handle(Geom2d_Curve) pc2 = CDS.Curve2();
-+    
-+    TopTools_ListIteratorOfListOfShape itLE = TopB.NewEdges(ic);
-+    while (itLE.More()) {
-+      TopoDS_Edge E = TopoDS::Edge(itLE.Value());
-+      
-+      PutInBounds (F1,E,pc1);
-+      PutInBounds (F2,E,pc2);
-+      
-+      B.UpdateEdge (E,pc1,F1,0.);
-+      B.UpdateEdge (E,pc2,F2,0.);
-+      
-+      L.Append (E);
-+      
-+      itLE.Next();
-+      if (itLE.More()) {
-+      pc1 = Handle(Geom2d_Curve)::DownCast(pc1->Copy());
-+      pc2 = Handle(Geom2d_Curve)::DownCast(pc2->Copy());
-+      }
-+    }
-+  }
-+
-+  // ========================
-+  // store same domain faces 
-+  // ========================
-+
-+
-+  if ( DatStr->HasSameDomain( F1 ))
-+  {
-+    TopTools_ListOfShape emptyList;
-+    if (!mySameDomainFM.IsBound(F1))
-+      mySameDomainFM.Bind(F1,emptyList);
-+    if (!mySameDomainFM.IsBound(F2))
-+      mySameDomainFM.Bind(F2,emptyList);
-+    mySameDomainFM(F1).Append(F2);
-+    mySameDomainFM(F2).Append(F1);
-+  }
-+
-+  // ====================
-+  // Store section edges
-+  // ====================
-+
-+  const TopOpeBRepDS_DataStructure& DS = DatStr->DS();
-+  Standard_Integer j,i,nse = DS.NbSectionEdges();
-+  if (nse == 0) return;
-+
-+    
-+  TopoDS_Vertex V, sdeV1, sdeV2;
-+  TopTools_MapOfShape MV;
-+  TopTools_ListOfShape LSE; // list of section edges
-+  TopoDS_Face dummyF;
-+  
-+  for (i = 1; i <= nse; i++)
-+  {
-+    const TopoDS_Edge & se = DS.SectionEdge(i);
-+    if (! TopB.IsSplit(se,TopAbs_ON))
-+      continue;
-+    LSE.Append( se );
-+
-+    // add vertices where section edges interferes with other
-+    // edges as its descendant in myAsDes
-+    
-+    TopoDS_Edge sde, oe; // same domain, other edge
-+    if (DatStr->HasSameDomain(se)) {
-+      sde = TopoDS::Edge( DatStr->SameDomain(se).Value() );
-+      TopExp::Vertices( sde, sdeV1, sdeV2);
-+    }
-+    TColStd_MapOfInteger MIV; // indices of added edges
-+    TopOpeBRepDS_PointIterator itP (DS.ShapeInterferences( se ));
-+    itP.SupportKind( TopOpeBRepDS_EDGE );
-+    // loop on intersections of se
-+    for (; itP.More(); itP.Next()) {
-+      oe = TopoDS::Edge( DS.Shape( itP.Support()));
-+      if (itP.IsVertex()) {
-+        // there is a vertex at intersection
-+      if ( !MIV.Add( itP.Current() ))
-+        continue;
-+      V = TopoDS::Vertex( DS.Shape( itP.Current()));
-+      if ( !sde.IsNull() && (V.IsSame(sdeV1) || V.IsSame(sdeV2)) )
-+        oe = sde;
-+      V = ReplaceSameDomainV( V , oe );
-+      V.Orientation( TopAbs_INTERNAL);
-+      B.UpdateVertex( V, itP.Parameter(), se, 0.); // AddVonE() sets real U
-+      }
-+      else {
-+        // create a new vertex at the intersection point
-+      const TopOpeBRepDS_Point& DSP = DS.Point( itP.Current());
-+      V = BRepLib_MakeVertex( DSP.Point() );
-+      V.Orientation( TopAbs_INTERNAL);
-+      B.UpdateVertex( V, itP.Parameter(), se, DSP.Tolerance());
-+      // make V be on the other edge
-+      TopOpeBRepDS_PointIterator itOP (DS.ShapeInterferences( oe ));
-+      for (; itOP.More(); itOP.Next()) {
-+        const TopOpeBRepDS_Point& ODSP = DS.Point( itOP.Current());
-+        if ( DSP.IsEqual (ODSP)) {
-+          B.UpdateVertex( V, itOP.Parameter(), TopoDS::Edge(oe), ODSP.Tolerance());
-+          break;
-+        }
-+      }
-+      }
-+      // add V on the both intersecting edges
-+      TopoDS_Vertex addedV = Partition_Inter2d::AddVonE( V,se,oe,myAsDes,dummyF);
-+      if (!addedV.IsSame( V ))
-+      mySameDomainVM.Bind (V, addedV); // equal vertex is already there
-+
-+      MV.Add( addedV ); // to ease storage of vertices of ON splits
-+    }
-+  }
-+
-+  // add section edge to the face it intersects and find
-+  // splits ON that do not have same domain pair
-+  
-+  TopB.SplitSectionEdges(); // let TopB find ON splits
-+
-+  TopTools_MapOfShape SPM; // map of ON splits
-+  TopTools_IndexedMapOfShape ME[2];
-+  TopExp::MapShapes( F1, TopAbs_EDGE, ME[1]);
-+  TopExp::MapShapes( F2, TopAbs_EDGE, ME[0]);
-+
-+  TopTools_ListIteratorOfListOfShape itSP, itLSE (LSE);
-+  while ( itLSE.More() ) {
-+
-+    TopoDS_Edge se = TopoDS::Edge( itLSE.Value() );
-+
-+    // move itLSE to the next se
-+    Standard_Integer ancRank = DS.AncestorRank(se);
-+    if (ME[ancRank-1].Contains( se ))
-+    {
-+      LSE.Remove( itLSE ); // se is an edge of face it intersects
-+      continue;
-+    }
-+    else
-+    {
-+      itLSE.Next();
-+    }
-+
-+    const TopoDS_Face& F = (ancRank == 1) ? F2 : F1;
++#include "Partition_Loop.ixx"
 +
-+    // add se to face but dont add twice
-+    TopTools_ListIteratorOfListOfShape itE( myAsDes->Descendant( F ));
-+    if (myAsDes->HasDescendant( F )) {
-+      for ( ; itE.More(); itE.Next())
-+      if (se.IsSame( itE.Value() ))
-+        break;
-+    }
-+    if (!itE.More())
-+    {
-+      myAsDes->Add( F, se );
+ #include <BRep_Builder.hxx>
+ #include <BRepAlgo_FaceRestrictor.hxx>
+ #include <BRep_Tool.hxx>
+diff -Naur --exclude=CVS netgen-4.5_orig/libsrc/occ/Partition_Loop2d.cxx netgen-4.5_new/libsrc/occ/Partition_Loop2d.cxx
+--- netgen-4.5_orig/libsrc/occ/Partition_Loop2d.cxx    2005-06-09 18:51:10.000000000 +0400
++++ netgen-4.5_new/libsrc/occ/Partition_Loop2d.cxx     2010-06-23 13:19:48.000000000 +0400
+@@ -12,9 +12,11 @@
+ //  $Header$
+ //using namespace std;
+-#include "Partition_Loop2d.ixx"
 +
-+      // check se pcurve on F
-+      Standard_Real tol, f,l, umin=1e100, umax=-1e100;
-+      Handle(Geom2d_Curve) pc = BRep_Tool::CurveOnSurface( se, F, f,l);
-+      if (pc.IsNull()) {
-+      itSP.Initialize( TopB.Splits(se,TopAbs_ON) );
-+      for ( ; itSP.More(); itSP.Next()) {
-+        const TopoDS_Edge& E = TopoDS::Edge ( itSP.Value());
-+        BRep_Tool::Range(E, f, l);
-+        umin = Min( umin, f);
-+        umax = Max( umax, l);
-+      }
-+      Handle(Geom_Curve) C3d = BRep_Tool::Curve( se, f, l);
-+      if (umin < umax) // sometimes umin == umax for closed edge
-+        C3d = new Geom_TrimmedCurve( C3d, umin, umax);
-+      pc = TopOpeBRepTool_CurveTool::MakePCurveOnFace (F,C3d,tol);
-+      if (pc.IsNull()) {
-+        MESSAGE (" CANT BUILD PCURVE ");
-+      }
-+      B.UpdateEdge( se, pc, F, tol);
-+      }
-+    }
+ #include "utilities.h"
 +
-+    // to detect splits that do not have same domain pair
-+    // ie which split a face into parts and not pass by its boundary
-+    itSP.Initialize( TopB.Splits(se,TopAbs_ON) );
-+    for ( ; itSP.More(); itSP.Next()) {
-+      const TopoDS_Shape& SP = itSP.Value();
-+      if (!SPM.Add( SP ))
-+      SPM.Remove( SP );
-+    }
-+  }
++#include "Partition_Loop2d.ixx"
+ #include <stdio.h>
+ #include <BRepAdaptor_Curve2d.hxx>
+diff -Naur --exclude=CVS netgen-4.5_orig/libsrc/occ/Partition_Loop3d.cxx netgen-4.5_new/libsrc/occ/Partition_Loop3d.cxx
+--- netgen-4.5_orig/libsrc/occ/Partition_Loop3d.cxx    2005-06-09 18:51:10.000000000 +0400
++++ netgen-4.5_new/libsrc/occ/Partition_Loop3d.cxx     2010-06-23 13:19:48.000000000 +0400
+@@ -10,6 +10,11 @@
+ //  Module : GEOM
+ //using namespace std;
 +
-+  // store vertices of ON splits and bind section edges to faces
-+  
-+  for (itLSE.Initialize (LSE); itLSE.More(); itLSE.Next())
-+  {
-+    const TopoDS_Shape& se = itLSE.Value();
 +
-+    Standard_Integer ancRank = DS.AncestorRank(se);
-+    TopoDS_Face F = (ancRank == 1) ? F2 : F1;
 +
-+    // add vertices of ON splits which have no same domain pair
-+    Standard_Boolean added = Standard_False;
-+    itSP.Initialize( TopB.Splits(se,TopAbs_ON) );
-+    for ( ; itSP.More(); itSP.Next())
-+    {
-+      if (!SPM.Contains( itSP.Value() ))
-+      continue;
-+      
-+      const TopoDS_Edge& S = TopoDS::Edge ( itSP.Value());
++#include "utilities.h"
 +
-+      added = Standard_True;
-+      mySectionEdgesAD->Add( F, se );
-+      
-+      TopoDS_Vertex VS[2];
-+      TopExp::Vertices (S, VS[0], VS[1]);
-+      for (j=0; j<2; ++j)
-+      {
-+      if (mySameDomainVM.IsBound( VS[j] ))
-+        VS[j] = TopoDS::Vertex( mySameDomainVM( VS[j] ));
-+      if ( !MV.Contains( VS[j] )) {
-+        // find equal vertex on se - point interference
-+        gp_Pnt P1 = BRep_Tool::Pnt( VS[j] );
-+        TopTools_ListIteratorOfListOfShape itV( myAsDes->Descendant(se) );
-+        for (; itV.More(); itV.Next()) {
-+          V = TopoDS::Vertex( itV.Value() );
-+            if ( V.IsSame( VS[j] ))
-+              break;
-+          gp_Pnt P2 = BRep_Tool::Pnt( V );
-+          if (P1.IsEqual( P2, Precision::Confusion())) {
-+            mySameDomainVM.Bind (VS[j], V);
-+            VS[j] = V;
-+            break;
-+          }
-+        }
-+        if (!itV.More())  // no interferences with edges
-+          myAsDes->Add( se, VS[j]);
-+      }
+ #include "Partition_Loop3d.ixx"
+ #include <TopExp_Explorer.hxx>
+diff -Naur --exclude=CVS netgen-4.5_orig/libsrc/occ/Partition_Spliter.cxx netgen-4.5_new/libsrc/occ/Partition_Spliter.cxx
+--- netgen-4.5_orig/libsrc/occ/Partition_Spliter.cxx   2005-07-11 10:33:27.000000000 +0400
++++ netgen-4.5_new/libsrc/occ/Partition_Spliter.cxx    2010-06-23 13:19:48.000000000 +0400
+@@ -29,14 +29,15 @@
+ //  $Header$
+ //using namespace std;
 +
-+        // add ends of ON splits to F in order to detect later
-+        // if a split is on face in IsSplitOn()
-+      mySectionEdgesAD->Add( F, VS[j]);
-+      }
-+      // in the descendants of F, first go ends of an ON split and
-+      // then a split itself
-+      mySectionEdgesAD->Add( F, S );
-+    }
-+    if (!added)
-+      mySectionEdgesAD->Add( F, se );
-+    
-+    myNewEdges.Add( se );
-+  }
-+}
++#include "utilities.h"
 +
-+//=======================================================================
-+//function : FacesPartition
-+//purpose  : 
-+//=======================================================================
-+
-+void Partition_Inter3d::FacesPartition(const TopoDS_Face& F1,
-+                                     const TopoDS_Face& F2)
-+     //(const TopTools_DataMapOfShapeListOfShape& /*SetOfFaces2*/)
-+{
-+  TopTools_ListOfShape LInt;
-+
-+  Inter3D (F1,F2,LInt);
-+  
-+  StorePart3d (F1,F2,LInt);
-+}
-+
-+//=======================================================================
-+//function : SetDone
-+//purpose  : 
-+//=======================================================================
-+
-+void Partition_Inter3d::SetDone(const TopoDS_Face& F1, 
-+                              const TopoDS_Face& F2)
-+{
-+  if (!myDone.IsBound(F1)) {
-+    TopTools_ListOfShape emptyList;
-+    myDone.Bind(F1,emptyList);
-+  }
-+  myDone(F1).Append(F2);
-+  if (!myDone.IsBound(F2)) {
-+    TopTools_ListOfShape emptyList;
-+    myDone.Bind(F2,emptyList);
-+  }
-+  myDone(F2).Append(F1);
-+}
-+
-+//=======================================================================
-+//function : IsDone
-+//purpose  : 
-+//=======================================================================
-+
-+Standard_Boolean Partition_Inter3d::IsDone(const TopoDS_Face& F1, 
-+                                         const TopoDS_Face& F2) 
-+
-+  const 
-+{
-+  if (myDone.IsBound(F1)) {
-+    TopTools_ListIteratorOfListOfShape it (myDone(F1));
-+    for (; it.More(); it.Next()) {
-+      if (it.Value().IsSame(F2)) return Standard_True;
-+    }
-+  }
-+  return Standard_False;
-+}
-+
-+//=======================================================================
-+//function : StorePart3d
-+//purpose  : 
-+//=======================================================================
-+
-+void Partition_Inter3d::StorePart3d(const TopoDS_Face& F1, 
-+                                  const TopoDS_Face& F2, 
-+                                  const TopTools_ListOfShape& LInt)
-+{
-+  if (!LInt.IsEmpty()) {
-+    myAsDes->Add( F1,LInt);
-+    myAsDes->Add( F2,LInt);
-+
-+    TopTools_ListIteratorOfListOfShape it(LInt);
-+    for (; it.More(); it.Next()) {
-+
-+      TopoDS_Edge E = TopoDS::Edge(it.Value());
-+
-+      BRep_Builder B;
-+      B.SameParameter(E,Standard_False);
-+      BRepLib::SameParameter(E,1.0e-7);
-+      
-+      myNewEdges.Add(E);
-+    }
-+  }
-+  SetDone(F1,F2);
-+}
-+
-+//=======================================================================
-+//function : TouchedFaces
-+//purpose  : 
-+//=======================================================================
-+
-+TopTools_MapOfShape& Partition_Inter3d::TouchedFaces()
-+{
-+  return myTouched;
-+}
-+
-+//=======================================================================
-+//function : AsDes
-+//purpose  : 
-+//=======================================================================
-+
-+Handle(BRepAlgo_AsDes) Partition_Inter3d::AsDes() const 
-+{
-+  return myAsDes;
-+}
-+
-+//=======================================================================
-+//function : NewEdges
-+//purpose  : 
-+//=======================================================================
-+
-+TopTools_MapOfShape& Partition_Inter3d::NewEdges() 
-+{
-+  return myNewEdges;
-+}
-+
-+//=======================================================================
-+//function : Affiche
-+//purpose  : 
-+//=======================================================================
-+
-+void Partition_Inter3d::Affiche(const TopTools_ListOfShape& SetOfFaces) const
-+{
-+#ifdef DEB
-+  char PSection[1024];
-+  char *section=PSection;
-+  Standard_Integer i = 0;
-+  Standard_Real j=1;
-+  TopTools_ListOfShape aList;
-+  TopTools_ListIteratorOfListOfShape it;
-+  for (it.Initialize(SetOfFaces); it.More(); it.Next()) {
-+    const TopoDS_Shape& OS = it.Value();
-+    aList=myAsDes->Descendant(OS);
-+    MESSAGE ( " the number of items stored in the list " << j << " :  " << aList.Extent() )
-+    j++;
-+    TopTools_ListIteratorOfListOfShape itaList;
-+    for (itaList.Initialize(aList); itaList.More(); itaList.Next()) {
-+      const TopoDS_Shape& SS = itaList.Value();
-+      i++;
-+      sprintf(PSection,"section_%d",i);
-+      DBRep::Set(section,SS);  
-+    }
-+  }
-+#endif
-+}
-+
-+//=======================================================================
-+//function : SameDomain
-+//purpose  : 
-+//=======================================================================
-+
-+const TopTools_ListOfShape& Partition_Inter3d::SameDomain(const TopoDS_Face& F) const
-+{
-+  if (mySameDomainFM.IsBound( F ))
-+    return mySameDomainFM (F);
-+
-+  static TopTools_ListOfShape emptyList;
-+  return emptyList;
-+}
-+
-+//=======================================================================
-+//function : HasSameDomainF
-+//purpose  : Return true if F has same domain faces
-+//=======================================================================
-+
-+Standard_Boolean Partition_Inter3d::HasSameDomainF(const TopoDS_Shape& F) const
-+{
-+  return mySameDomainFM.IsBound( F );
-+}
-+
-+//=======================================================================
-+//function : IsSameDomain
-+//purpose  : Return true if F1 and F2 are same domain faces
-+//=======================================================================
-+
-+Standard_Boolean Partition_Inter3d::IsSameDomainF(const TopoDS_Shape& F1,
-+                                               const TopoDS_Shape& F2) const
-+{
-+  if (mySameDomainFM.IsBound( F1 )) {
-+    TopTools_ListIteratorOfListOfShape it (mySameDomainFM( F1 ));
-+    for (; it.More(); it.Next()) 
-+      if (F2.IsSame( it.Value()))
-+      return Standard_True;
-+  }
-+  return F1.IsSame( F2 );
-+}
-+
-+//=======================================================================
-+//function : ReplaceSameDomainV
-+//purpose  : return same domain vertex of  V if it was replaced
-+//           and make this vertex to be on E too, else return V
-+//=======================================================================
-+
-+TopoDS_Vertex Partition_Inter3d::ReplaceSameDomainV(const TopoDS_Vertex& V,
-+                                                  const TopoDS_Edge&   E) const
-+{
-+  TopoDS_Vertex SDV = V;
-+  if (mySameDomainVM.IsBound( V )) {
-+
-+    TopoDS_Vertex V1,V2;
-+    TopExp::Vertices(E,V1,V2);
-+    Standard_Boolean isClosed = V1.IsSame( V2 ) && V.IsSame(V1);
-+
-+    SDV = TopoDS::Vertex( mySameDomainVM(V) );
-+    Standard_Real tol = BRep_Tool::Tolerance( V );
-+    BRep_Builder B;
-+    SDV.Orientation( V.Orientation());
-+
-+    if (isClosed) {
-+      Standard_Real f, l;
-+      BRep_Tool::Range (E, f, l);
-+      Standard_Boolean isFirst = IsEqual( BRep_Tool::Parameter(V,E), f );
-+      B.UpdateVertex(SDV, (isFirst ? f : l), E, tol);
-+      SDV.Reverse();
-+      B.UpdateVertex(SDV, (isFirst ? l : f), E, tol);
-+    }
-+    else
-+      B.UpdateVertex (SDV, BRep_Tool::Parameter(V,E), E, tol);
-+      
-+  }
-+  return SDV;
-+}
-+
-+//=======================================================================
-+//function : SectionEdgesAD
-+//purpose  : 
-+//=======================================================================
-+
-+Handle(BRepAlgo_AsDes) Partition_Inter3d::SectionEdgesAD() const
-+{
-+  return mySectionEdgesAD;
-+}
-+
-+//=======================================================================
-+//function : IsSectionEdge
-+//purpose  : return True if  E  is  an  edge  of  a face and it
-+//           intersects an other face
-+//=======================================================================
-+
-+Standard_Boolean
-+  Partition_Inter3d::IsSectionEdge(const TopoDS_Edge& E) const
-+{
-+  return mySectionEdgesAD->HasAscendant(E);
-+}
-+
-+//=======================================================================
-+//function : HasSectionEdge
-+//purpose  : return True if an  edge  of  F intersects an other
-+//           face or F is intersected by edge of an other face
-+//=======================================================================
-+
-+Standard_Boolean
-+  Partition_Inter3d::HasSectionEdge(const TopoDS_Face& F) const
-+{
-+  return mySectionEdgesAD->HasDescendant(F);
-+}
-+
-+//=======================================================================
-+//function : IsSplitOn
-+//purpose  : return True if NewE is split of OldE on F
-+//=======================================================================
-+
-+Standard_Boolean
-+  Partition_Inter3d::IsSplitOn(const TopoDS_Edge& NewE,
-+                             const TopoDS_Edge& OldE,
-+                             const TopoDS_Face& F) const
-+{
-+  if (! mySectionEdgesAD->HasDescendant(F))
-+    return Standard_False;
-+
-+  TopTools_ListIteratorOfListOfShape itE ( mySectionEdgesAD->Descendant(F) );
-+  for ( ; itE.More(); itE.Next()) {
-+    if ( itE.Value().ShapeType() != TopAbs_EDGE ||
-+      ! OldE.IsSame ( itE.Value() ))
-+      continue;
-+    // an edge encountered, its vertices and a split come next
-+    itE.Next();
-+    if (!itE.More()) break;
-+    const TopoDS_Shape& V3 = itE.Value();
-+    if (V3.ShapeType() != TopAbs_VERTEX) continue;
-+    itE.Next();
-+    if (!itE.More()) break;
-+    const TopoDS_Shape& V4 = itE.Value();
-+    if (V4.ShapeType() != TopAbs_VERTEX) continue;
-+
-+    TopoDS_Vertex V1, V2;
-+    TopExp::Vertices( OldE, V1, V2);
-+    
-+    if ( V1.IsSame(V2) &&
-+      (V1.IsSame(V3) || V1.IsSame(V4)) ) {
-+      // closed old edge; use the split for the test 
-+      itE.Next();
-+      if (!itE.More()) break;
-+      const TopoDS_Edge& split = TopoDS::Edge( itE.Value() );
-+      // check distance at middle point of NewE
-+      Standard_Real f1,l1, f2,l2;
-+      Handle(Geom2d_Curve) PC1 = BRep_Tool::CurveOnSurface( split, F ,f1,l1);
-+      if (!PC1.IsNull()) {
-+      Handle(Geom2d_Curve) PC2 = BRep_Tool::CurveOnSurface(NewE, F ,f2,l2);
-+      gp_Pnt2d P = PC2->Value( 0.5*(f2+l2) );
-+      Geom2dAPI_ProjectPointOnCurve proj (P, PC1, f1, l1);
-+      if (proj.NbPoints() &&
-+          proj.LowerDistance() <= Precision::Confusion())
-+        return Standard_True;
-+      }
-+      else {
-+        Handle(Geom_Curve) C1 = BRep_Tool::Curve( split ,f1,l1);
-+      Handle(Geom_Curve) C2 = BRep_Tool::Curve( NewE  ,f2,l2);
-+      gp_Pnt P = C2->Value( 0.5*(f2+l2) );
-+      GeomAPI_ProjectPointOnCurve proj (P, C1, f1, l1);
-+      if (proj.NbPoints() &&
-+          proj.LowerDistance() <= Precision::Confusion())
-+        return Standard_True;
-+      }
-+    }
-+    else {
-+      Standard_Real u3 = BRep_Tool::Parameter( TopoDS::Vertex(V3), OldE);
-+      Standard_Real u4 = BRep_Tool::Parameter( TopoDS::Vertex(V4), OldE);
-+
-+      Standard_Real f,l, u;
-+      BRep_Tool::Range( NewE, f,l);
-+      u = 0.5*(f+l);
-+      f = Min(u3,u4);
-+      l = Max(u3,u4);
-+
-+      if (u <= l && u >= f)
-+        return Standard_True;
-+    }
-+  }
-+  return Standard_False;
-+}
-+
-+//=======================================================================
-+//function : SectionEdgeFaces
-+//purpose  : return faces cut by section edge
-+//=======================================================================
-+
-+const TopTools_ListOfShape&
-+  Partition_Inter3d::SectionEdgeFaces(const TopoDS_Edge& SecE) const
-+{
-+  return mySectionEdgesAD->Ascendant( SecE );
-+}
-+
-+#endif
-diff -Naur --exclude=CVS netgen-4.5_orig/libsrc/occ/Partition_Loop.cxx netgen-4.5_new/libsrc/occ/Partition_Loop.cxx
---- netgen-4.5_orig/libsrc/occ/Partition_Loop.cxx      2005-06-09 18:51:10.000000000 +0400
-+++ netgen-4.5_new/libsrc/occ/Partition_Loop.cxx       2010-06-23 13:19:48.000000000 +0400
-@@ -29,12 +29,14 @@
- //  $Header$
- //using namespace std;
--#include <stdio.h>
--#include "Partition_Loop.ixx"
- #include "utilities.h"
-+#include <stdio.h>
-+
-+#include "Partition_Loop.ixx"
-+
- #include <BRep_Builder.hxx>
- #include <BRepAlgo_FaceRestrictor.hxx>
- #include <BRep_Tool.hxx>
-diff -Naur --exclude=CVS netgen-4.5_orig/libsrc/occ/Partition_Loop.cxx.orig netgen-4.5_new/libsrc/occ/Partition_Loop.cxx.orig
---- netgen-4.5_orig/libsrc/occ/Partition_Loop.cxx.orig 1970-01-01 03:00:00.000000000 +0300
-+++ netgen-4.5_new/libsrc/occ/Partition_Loop.cxx.orig  2010-06-23 13:19:48.000000000 +0400
-@@ -0,0 +1,472 @@
-+#ifdef OCCGEOMETRY
-+
-+//  GEOM PARTITION : partition algorithm
-+//
-+//  Copyright (C) 2003  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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
-+//
-+//
-+//
-+//  File   : Partition_Loop.cxx
-+//  Author : Benedicte MARTIN
-+//  Module : GEOM
-+//  $Header$
-+
-+//using namespace std;
-+#include <stdio.h>
-+
-+#include "Partition_Loop.ixx"
-+
-+#include "utilities.h"
-+
-+#include <BRep_Builder.hxx>
-+#include <BRepAlgo_FaceRestrictor.hxx>
-+#include <BRep_Tool.hxx>
-+
-+#include <Geom2d_Curve.hxx>
-+#include <Geom_Surface.hxx>
-+
-+#include <TopTools_SequenceOfShape.hxx>
-+#include <TopTools_ListIteratorOfListOfShape.hxx>
-+#include <TopTools_MapOfShape.hxx>
-+#include <TopTools_MapIteratorOfMapOfShape.hxx>
-+#include <TopTools_MapOfOrientedShape.hxx>
-+#include <TopTools_DataMapOfShapeShape.hxx>
-+#include <TopTools_DataMapIteratorOfDataMapOfShapeListOfShape.hxx>
-+
-+#include <gp_Pnt.hxx>
-+#include <gp_Pnt2d.hxx>
-+
-+#include <TopoDS.hxx>
-+#include <TopoDS_Vertex.hxx>
-+#include <TopoDS_Wire.hxx>
-+#include <TopoDS_Iterator.hxx>
-+
-+#include <Precision.hxx>
-+#include <BRep_TVertex.hxx>
-+#include <BRep_TEdge.hxx>
-+
-+#include <TopExp.hxx>
-+#include <TopExp_Explorer.hxx>
-+
-+static char* name = new char[100];
-+static int nbe = 0;
-+
-+//=======================================================================
-+//function : Partition_Loop
-+//purpose  : 
-+//=======================================================================
-+Partition_Loop::Partition_Loop()
-+{
-+}
-+
-+//=======================================================================
-+//function : Init
-+//purpose  : 
-+//=======================================================================
-+void Partition_Loop::Init(const TopoDS_Face& F)
-+{
-+  myConstEdges.Clear(); 
-+  myNewWires  .Clear();
-+  myNewFaces  .Clear();
-+  myFace = F;
-+}
-+
-+//=======================================================================
-+//function : AddConstEdge
-+//purpose  : 
-+//=======================================================================
-+void Partition_Loop::AddConstEdge (const TopoDS_Edge& E)
-+{
-+  myConstEdges.Append(E);
-+}
-+
-+
-+//=======================================================================
-+//function : FindDelta
-+//purpose  : 
-+//=======================================================================
-+static Standard_Real FindDelta(TopTools_ListOfShape& LE,
-+                             const TopoDS_Face& F)
-+{
-+  Standard_Real dist, f, l;
-+  Standard_Real d = Precision::Infinite();
-+  TopTools_ListIteratorOfListOfShape itl;
-+
-+  for ( itl.Initialize(LE); itl.More(); itl.Next()) {
-+    const TopoDS_Edge& E = TopoDS::Edge(itl.Value());
-+    Handle(Geom2d_Curve) C = BRep_Tool::CurveOnSurface(E,F,f,l);
-+    gp_Pnt2d p = C->Value(f);
-+    gp_Pnt2d pp = C->Value(l);
-+    Standard_Real d1 = p.Distance(pp);
-+    if (d1<d) { d=d1;}
-+  }
-+  dist = d ;
-+  return dist;
-+}
-+
-+//=======================================================================
-+//function : SelectEdge
-+//purpose  : Find the edge <NE> connected <CE> by the vertex <CV> in the list <LE>.
-+//           <NE> Is erased  of the list. If <CE> is too in the list <LE> 
-+//                     with the same orientation, it's erased of the list 
-+//=======================================================================
-+static Standard_Boolean  SelectEdge(const TopoDS_Face&    F,
-+                                  const TopoDS_Edge&    CE,
-+                                  const TopoDS_Vertex&  CV,
-+                                  TopoDS_Edge&          NE,
-+                                  TopTools_ListOfShape& LE)
-+{
-+  TopTools_ListIteratorOfListOfShape itl;
-+  NE.Nullify();
-+  for ( itl.Initialize(LE); itl.More(); itl.Next()) {
-+    if (itl.Value().IsEqual(CE)) {
-+      LE.Remove(itl);
-+      break;
-+    }
-+  }
-+
-+  if (LE.Extent() > 1) {
-+    //--------------------------------------------------------------
-+    // Several possible edges.   
-+    // - Test the edges differents of CE 
-+    //--------------------------------------------------------------
-+    Standard_Real   cf, cl, f, l;
-+    TopoDS_Face FForward = F;
-+    Handle(Geom2d_Curve) Cc, C;
-+    FForward.Orientation(TopAbs_FORWARD);
-+                      
-+    Cc = BRep_Tool::CurveOnSurface(CE,FForward,cf,cl);
-+    Standard_Real dist,distmin  = 100*BRep_Tool::Tolerance(CV);
-+    Standard_Real uc,u;
-+    if (CE.Orientation () == TopAbs_FORWARD) uc = cl;
-+    else                                     uc = cf;
-+
-+    gp_Pnt2d P2,PV = Cc->Value(uc); 
-+
-+    Standard_Real delta = FindDelta(LE,FForward);
-+
-+    for ( itl.Initialize(LE); itl.More(); itl.Next()) {
-+      const TopoDS_Edge& E = TopoDS::Edge(itl.Value());
-+      if (!E.IsSame(CE)) {
-+      C = BRep_Tool::CurveOnSurface(E,FForward,f,l);
-+      if (E.Orientation () == TopAbs_FORWARD) u = f;
-+      else                                    u = l;
-+      P2 = C->Value(u);
-+      dist = PV.Distance(P2);
-+      if (dist <= distmin){
-+        distmin = dist;
-+      }
-+                              
-+      }
-+    }
-+
-+    Standard_Real anglemax = - PI;
-+    TopoDS_Edge   SelectedEdge;       
-+    for ( itl.Initialize(LE); itl.More(); itl.Next()) {
-+      const TopoDS_Edge& E = TopoDS::Edge(itl.Value());
-+      if (!E.IsSame(CE)) {
-+      C = BRep_Tool::CurveOnSurface(E,FForward,f,l);
-+      if (E.Orientation () == TopAbs_FORWARD) u = f;
-+      else                                    u = l;
-+      P2 = C->Value(u);
-+      dist = PV.Distance(P2);
-+      if (dist <= distmin + (1./3)*delta){ 
-+        gp_Pnt2d PC, P;
-+        gp_Vec2d CTg1, CTg2, Tg1, Tg2;
-+        Cc->D2(uc, PC, CTg1, CTg2);
-+        C->D2(u, P, Tg1, Tg2);
-+
-+        Standard_Real angle;
-+
-+        if (CE.Orientation () == TopAbs_REVERSED && E.Orientation () == TopAbs_FORWARD) {
-+          angle = CTg1.Angle(Tg1.Reversed());
-+        }
-+        else if (CE.Orientation () == TopAbs_FORWARD && E.Orientation () == TopAbs_REVERSED) {
-+          angle = (CTg1.Reversed()).Angle(Tg1);
-+        }
-+        else if (CE.Orientation () == TopAbs_REVERSED && E.Orientation () == TopAbs_REVERSED) {
-+          angle = CTg1.Angle(Tg1);
-+        }
-+        else if (CE.Orientation () == TopAbs_FORWARD && E.Orientation () == TopAbs_FORWARD) {
-+          angle = (CTg1.Reversed()).Angle(Tg1.Reversed());
-+        }
-+        if (angle >= anglemax) {
-+          anglemax = angle ;
-+          SelectedEdge = E;   
-+        }
-+      }
-+      }
-+    }
-+    for ( itl.Initialize(LE); itl.More(); itl.Next()) {
-+      const TopoDS_Edge& E = TopoDS::Edge(itl.Value());
-+      if (E.IsEqual(SelectedEdge)) {
-+      NE = TopoDS::Edge(E);
-+      LE.Remove(itl);
-+      break;
-+      }
-+    }                                 
-+  }
-+  else if (LE.Extent() == 1) {
-+    NE = TopoDS::Edge(LE.First());
-+    LE.RemoveFirst();
-+  }
-+  else {
-+    return Standard_False;
-+  }
-+  return Standard_True;
-+}
-+
-+//=======================================================================
-+//function : SamePnt2d
-+//purpose  : 
-+//=======================================================================
-+static Standard_Boolean  SamePnt2d(TopoDS_Vertex  V,
-+                                 TopoDS_Edge&   E1,
-+                                 TopoDS_Edge&   E2,
-+                                 TopoDS_Face&   F)
-+{
-+  Standard_Real   f1,f2,l1,l2;
-+  gp_Pnt2d        P1,P2;
-+  TopoDS_Shape aLocalF = F.Oriented(TopAbs_FORWARD);
-+  TopoDS_Face FF = TopoDS::Face(aLocalF);
-+  Handle(Geom2d_Curve) C1 = BRep_Tool::CurveOnSurface(E1,FF,f1,l1);  
-+  Handle(Geom2d_Curve) C2 = BRep_Tool::CurveOnSurface(E2,FF,f2,l2);  
-+  if (E1.Orientation () == TopAbs_FORWARD) P1 = C1->Value(f1);
-+  else                                     P1 = C1->Value(l1);
-+  
-+  if (E2.Orientation () == TopAbs_FORWARD) P2 = C2->Value(l2);
-+  else                                     P2 = C2->Value(f2);
-+  Standard_Real Tol  = 100*BRep_Tool::Tolerance(V);
-+  Standard_Real Dist = P1.Distance(P2);
-+  return Dist < Tol; 
-+}
-+
-+//=======================================================================
-+//function : PurgeNewEdges
-+//purpose  : 
-+//=======================================================================
-+static void  PurgeNewEdges(TopTools_ListOfShape& ConstEdges,
-+                         const TopTools_MapOfOrientedShape&          UsedEdges)
-+{
-+  TopTools_ListIteratorOfListOfShape it(ConstEdges);
-+  while ( it.More()) {
-+    const TopoDS_Shape& NE = it.Value();
-+    if (!UsedEdges.Contains(NE)) {
-+      ConstEdges.Remove(it);
-+    }
-+    else {
-+      it.Next();
-+    }
-+  }  
-+}
-+
-+//=======================================================================
-+//function : StoreInMVE
-+//purpose  : 
-+//=======================================================================
-+static void StoreInMVE (const TopoDS_Face& F,
-+                      TopoDS_Edge& E,
-+                      TopTools_DataMapOfShapeListOfShape& MVE )
-+
-+{ 
-+  TopoDS_Vertex V1, V2;
-+  TopTools_ListOfShape Empty;
-+
-+  TopExp::Vertices(E,V1,V2);
-+  if (!MVE.IsBound(V1)) {
-+    MVE.Bind(V1,Empty);
-+  }
-+  MVE(V1).Append(E);
-+      
-+  if (!MVE.IsBound(V2)) {
-+    MVE.Bind(V2,Empty);
-+  }
-+  MVE(V2).Append(E);
-+}
-+
-+//=======================================================================
-+//function : Perform
-+//purpose  : 
-+//=======================================================================
-+void Partition_Loop::Perform()
-+{
-+
-+  TopTools_DataMapOfShapeListOfShape MVE;
-+  TopTools_DataMapIteratorOfDataMapOfShapeListOfShape Mapit, Mapit1;  
-+  TopTools_ListIteratorOfListOfShape                  itl;
-+  TopoDS_Vertex                                       V1,V2;
-+
-+  //-----------------------------------
-+  // Construction map vertex => edges
-+  //-----------------------------------
-+  for (itl.Initialize(myConstEdges); itl.More(); itl.Next()) {
-+    TopoDS_Edge& E = TopoDS::Edge(itl.Value());
-+    StoreInMVE(myFace,E,MVE);
-+  }
-+
-+  //----------------------------------------------
-+  // Construction of all the wires and of all the new faces. 
-+  //----------------------------------------------
-+  TopTools_MapOfOrientedShape UsedEdges;
-+
-+  while (!MVE.IsEmpty()) {
-+    TopoDS_Vertex    VF,CV;
-+    TopoDS_Edge      CE,NE,EF;
-+    TopoDS_Wire      NW;
-+    BRep_Builder     B;
-+    Standard_Boolean End= Standard_False;
-+
-+    B.MakeWire(NW);
-+    //--------------------------------
-+    // EF first edge.
-+    //--------------------------------
-+    Mapit.Initialize(MVE);
-+    EF = CE = TopoDS::Edge(Mapit.Value().First());
-+
-+    TopExp::Vertices(CE,V1,V2);
-+    //--------------------------------
-+    // VF first vertex 
-+    //--------------------------------
-+    if (CE.Orientation() == TopAbs_FORWARD) { 
-+      CV = VF = V1;
-+    }
-+    else  { 
-+      CV = VF = V2;
-+    }
-+    if (!MVE.IsBound(CV)) continue;
-+    for ( itl.Initialize(MVE(CV)); itl.More(); itl.Next()) {
-+      if (itl.Value().IsEqual(CE)) {
-+      MVE(CV).Remove(itl);
-+      break;
-+      }
-+    }
-+
-+    int i = 0;
-+    while (!End) { 
-+      //-------------------------------
-+      // Construction of a wire.
-+      //-------------------------------
-+      TopExp::Vertices(CE,V1,V2);
-+      if (!CV.IsSame(V1)) CV = V1; else CV = V2; 
-+      B.Add (NW,CE);
-+      UsedEdges.Add(CE);
-+
-+      //--------------
-+      // stop test
-+      //--------------                        
-+      if (!MVE.IsBound(CV) || MVE(CV).IsEmpty() || CV.IsSame(VF) ) {
-+      if (CV.IsSame(VF)) {
-+        if (MVE(CV).Extent() == 1 ) MVE.UnBind(CV);
-+        else {
-+          for ( itl.Initialize(MVE(CV)); itl.More(); itl.Next()) {
-+            if (itl.Value().IsEqual(CE)) {
-+              MVE(CV).Remove(itl);
-+              break;
-+            }
-+          }
-+        }
-+      }
-+      End=Standard_True;
-+      } 
-+
-+      //--------------
-+      // select edge
-+      //--------------
-+      else {
-+      Standard_Boolean find = SelectEdge(myFace,CE,CV,NE,MVE(CV));
-+      if (find) {
-+        CE=NE;
-+        if (MVE(CV).IsEmpty()) MVE.UnBind(CV);
-+        if (CE.IsNull() ) {
-+          MESSAGE ( " CE is  NULL !!! " )
-+          End=Standard_True;
-+        }
-+      }
-+      else {
-+        MESSAGE ( " edge doesn't exist " )
-+        End=Standard_True;
-+      }
-+      }
-+    }
-+
-+    //-----------------------------
-+    // Test if the wire is closed  
-+    //-----------------------------
-+    if (VF.IsSame(CV) && SamePnt2d(VF,EF,CE,myFace)) {
-+    }
-+    else{
-+      MESSAGE ( "wire not closed" )
-+    }
-+    myNewWires.Append (NW);                   
-+  }
-+
-+  PurgeNewEdges(myConstEdges,UsedEdges);
-+
-+}
-+
-+
-+//=======================================================================
-+//function : NewWires
-+//purpose  : 
-+//=======================================================================
-+const TopTools_ListOfShape&  Partition_Loop::NewWires() const 
-+{  
-+  return myNewWires;
-+}
-+
-+//=======================================================================
-+//function : NewFaces
-+//purpose  : 
-+//=======================================================================
-+const TopTools_ListOfShape&  Partition_Loop::NewFaces() const 
-+{  
-+  return myNewFaces;
-+}
-+ 
-+//=======================================================================
-+//function : WiresToFaces
-+//purpose  : 
-+//=======================================================================
-+void  Partition_Loop::WiresToFaces() 
-+{  
-+  if (!myNewWires.IsEmpty()) {
-+    BRepAlgo_FaceRestrictor FR;
-+
-+    TopAbs_Orientation OriF = myFace.Orientation();
-+    TopoDS_Shape aLocalS = myFace.Oriented(TopAbs_FORWARD);
-+
-+    FR.Init (TopoDS::Face(aLocalS),Standard_False);
-+    TopTools_ListIteratorOfListOfShape it(myNewWires);
-+    for (; it.More(); it.Next()) {
-+      FR.Add(TopoDS::Wire(it.Value()));
-+    }
-+
-+    FR.Perform();
-+    
-+    if (FR.IsDone()) {
-+      for (; FR.More(); FR.Next()) {
-+      myNewFaces.Append(FR.Current().Oriented(OriF));
-+      }
-+    }
-+  }
-+}
-+
-+
-+#endif
-diff -Naur --exclude=CVS netgen-4.5_orig/libsrc/occ/Partition_Loop2d.cxx netgen-4.5_new/libsrc/occ/Partition_Loop2d.cxx
---- netgen-4.5_orig/libsrc/occ/Partition_Loop2d.cxx    2005-06-09 18:51:10.000000000 +0400
-+++ netgen-4.5_new/libsrc/occ/Partition_Loop2d.cxx     2010-06-23 13:19:48.000000000 +0400
-@@ -12,9 +12,11 @@
- //  $Header$
- //using namespace std;
--#include "Partition_Loop2d.ixx"
-+
- #include "utilities.h"
-+
-+#include "Partition_Loop2d.ixx"
- #include <stdio.h>
- #include <BRepAdaptor_Curve2d.hxx>
-diff -Naur --exclude=CVS netgen-4.5_orig/libsrc/occ/Partition_Loop2d.cxx.orig netgen-4.5_new/libsrc/occ/Partition_Loop2d.cxx.orig
---- netgen-4.5_orig/libsrc/occ/Partition_Loop2d.cxx.orig       1970-01-01 03:00:00.000000000 +0300
-+++ netgen-4.5_new/libsrc/occ/Partition_Loop2d.cxx.orig        2010-06-23 13:19:48.000000000 +0400
-@@ -0,0 +1,1142 @@
-+#ifdef OCCGEOMETRY
-+
-+//  GEOM PARTITION : partition algorithm
-+//
-+//  Copyright (C) 2003  CEA/DEN, EDF R& D
-+//
-+//
-+//
-+//  File   : Partition_Loop2d.cxx
-+//  Author : Benedicte MARTIN
-+//  Module : GEOM
-+//  $Header$
-+
-+//using namespace std;
-+#include "Partition_Loop2d.ixx"
-+
-+#include "utilities.h"
-+#include <stdio.h>
-+
-+#include <BRepAdaptor_Curve2d.hxx>
-+#include <BRepAdaptor_Surface.hxx>
-+#include <BRepAlgo_AsDes.hxx>
-+#include <BRepAlgo_FaceRestrictor.hxx>
-+#include <BRepOffset_DataMapOfShapeReal.hxx>
-+#include <BRepTopAdaptor_FClass2d.hxx>
-+#include <BRep_Builder.hxx>
-+#include <BRep_Tool.hxx>
-+#include <Geom2dInt_GInter.hxx>
-+#include <Geom2d_Curve.hxx>
-+#include <IntRes2d_IntersectionPoint.hxx>
-+#include <Precision.hxx>
-+#include <TColStd_MapOfInteger.hxx>
-+#include <TColStd_SequenceOfReal.hxx>
-+#include <TopExp.hxx>
-+#include <TopExp_Explorer.hxx>
-+#include <TopTools_DataMapIteratorOfDataMapOfShapeListOfShape.hxx>
-+#include <TopTools_DataMapIteratorOfDataMapOfShapeShape.hxx>
-+#include <TopTools_DataMapOfShapeInteger.hxx>
-+#include <TopTools_DataMapOfShapeShape.hxx>
-+#include <TopTools_IndexedMapOfShape.hxx>
-+#include <TopTools_ListIteratorOfListOfShape.hxx>
-+#include <TopTools_MapIteratorOfMapOfShape.hxx>
-+#include <TopTools_MapOfOrientedShape.hxx>
-+#include <TopTools_MapOfShape.hxx>
-+#include <TopTools_SequenceOfShape.hxx>
-+#include <TopoDS.hxx>
-+#include <TopoDS_Iterator.hxx>
-+#include <TopoDS_Vertex.hxx>
-+#include <TopoDS_Wire.hxx>
-+#include <gp_Pnt.hxx>
-+#include <gp_Pnt2d.hxx>
-+
-+//=======================================================================
-+//function : Partition_Loop2d
-+//purpose  :
-+//=======================================================================
-+
-+Partition_Loop2d::Partition_Loop2d()
-+{
-+}
-+
-+//=======================================================================
-+//function : Init
-+//purpose  : Init with <F> the set of edges must have
-+//           pcurves on <F>.
-+//=======================================================================
-+
-+void Partition_Loop2d::Init(const TopoDS_Face& F)
-+{
-+  myConstEdges.Clear();
-+  myNewWires  .Clear();
-+  myNewFaces  .Clear();
-+  myFace = F;
-+  myFaceOri = myFace.Orientation();
-+  myFace.Orientation( TopAbs_FORWARD );
-+}
-+
-+//=======================================================================
-+//function : AddConstEdge
-+//purpose  : Add <E> as unique edge in the result.
-+//=======================================================================
-+
-+void Partition_Loop2d::AddConstEdge (const TopoDS_Edge& E)
-+{
-+#ifdef DEB
-+  Standard_Real f,l;
-+  Handle(Geom2d_Curve) pc = BRep_Tool::CurveOnSurface( E, myFace, f,l);
-+  if (pc.IsNull()) {
-+    INFOS( "AddConstEdge(): EDGE W/O PCURVE on FACE");
-+  } else
-+#endif
-+  {
-+    myConstEdges.Append(E);
-+  }
-+}
-+
-+void Partition_Loop2d::AddSectionEdge (const TopoDS_Edge& E)
-+{
-+#ifdef DEB
-+  Standard_Real f,l;
-+  Handle(Geom2d_Curve) pc = BRep_Tool::CurveOnSurface( E, myFace, f,l);
-+  if (pc.IsNull())
-+    pc = BRep_Tool::CurveOnSurface( E, myFace, f,l);
-+  gp_Vec2d Tg1;
-+  gp_Pnt2d PC;
-+  pc->D1(0.5*(f+l), PC, Tg1);
-+  if (Tg1.Magnitude()  <= gp::Resolution()) {
-+    MESSAGE ("");
-+  }
-+  if (pc.IsNull()) {
-+    INFOS( "AddConstEdge(): EDGE W/O PCURVE on FACE");
-+  } else
-+#endif
-+  {
-+    myConstEdges.Append(E);
-+    myConstEdges.Append(E.Reversed());
-+    mySectionEdges.Add( E );
-+  }
-+}
-+
-+//=======================================================================
-+//function : preciseU
-+//purpose  : find u such that the 3D point on theE is just out of tolerance
-+//           of theV
-+//=======================================================================
-+
-+static Standard_Real preciseU (const BRepAdaptor_Surface&  theSurf,
-+                               const TopoDS_Edge&          theE,
-+                               const TopoDS_Vertex&        theV,
-+                               const Handle(Geom2d_Curve)& theC,
-+                               const Standard_Boolean      theFirstEnd)
-+{
-+  Standard_Boolean isForward = ( theE.Orientation () == TopAbs_FORWARD );
-+  if (theFirstEnd) isForward = !isForward;
-+
-+  // find the first point in 2d and 3d
-+  Standard_Real f,l;
-+  BRep_Tool::Range( theE, f, l );
-+  Standard_Real u0 = isForward ? l : f;
-+  gp_Pnt2d aP2d0 = theC->Value( u0 );
-+  gp_Pnt aPnt0 = theSurf.Value( aP2d0.X(), aP2d0.Y() );
-+
-+  // shift in 2d and 3d
-+  Standard_Real du = ( l - f ) / 100, du3d = 0;
-+  if (isForward)
-+    du = -du;
-+
-+  // target parameter
-+  Standard_Real u;
-+
-+  while (du3d < ::RealSmall())
-+  {
-+    // u for test
-+    u = u0 + du;
-+    du *= 10; // for the next iteration: increase du untill du3d is large enough
-+
-+    // find out how u is far from u0 in 3D
-+    gp_Pnt2d aP2d  = theC->Value( u );
-+    gp_Pnt aPnt  = theSurf.Value( aP2d.X(), aP2d.Y() );
-+    du3d = aPnt0.Distance( aPnt );
-+  }
-+
-+  // find u such that the 3D point is just out of tolerance of theV
-+  Standard_Real tolV = BRep_Tool::Tolerance( theV ) + Precision::Confusion();
-+  u = u0 + du * tolV / du3d;
-+
-+  // check that u is within the range
-+  if ( isForward ? (u < f) : (u > l) )
-+    u = u0 + du;
-+
-+  return u;
-+}
-+
-+//=======================================================================
-+//function : SelectEdge
-+//purpose  : Find in the list <LE> the edge <NE> connected with <CE> by
-+//           the vertex <CV>.
-+//           <NE> is removed from the list. If <CE> is in <LE>
-+//           with the same orientation, it's removed from the list
-+//=======================================================================
-+
-+static Standard_Boolean  SelectEdge(const BRepAdaptor_Surface& Surf,
-+                                    const TopoDS_Edge&    CE,
-+                                    const TopoDS_Vertex&  CV,
-+                                    TopoDS_Edge&          NE,
-+                                    const TopTools_ListOfShape& LE)
-+{
-+  NE.Nullify();
-+
-+  if (LE.Extent() > 1) {
-+    //--------------------------------------------------------------
-+    // Several possible edges.
-+    // - Test the edges differents of CE
-+    //--------------------------------------------------------------
-+    TopoDS_Face FForward = Surf.Face();
-+    TopoDS_Edge aPrevNE;
-+
-+    gp_Vec2d CTg1, Tg1, CTg2, Tg2;
-+    gp_Pnt2d PC, P;
-+
-+    Standard_Real f, l;
-+    Handle(Geom2d_Curve) Cc, C;
-+    Cc = BRep_Tool::CurveOnSurface(CE,FForward,f,l);
-+
-+    Standard_Boolean isForward = ( CE.Orientation () == TopAbs_FORWARD );
-+    Standard_Real uc, u, du = Precision::PConfusion();
-+    uc = isForward ? ( l - du ) : ( f + du );
-+    Cc->D1(uc, PC, CTg1);
-+    if (!isForward) CTg1.Reverse();
-+
-+    Standard_Real anglemin = 3 * PI, tolAng = 1.e-8;
-+
-+    // select an edge whose first derivative is most left of CTg1
-+    // ie an angle between Tg1 and CTg1 is least
-+    TopTools_ListIteratorOfListOfShape itl;
-+    for ( itl.Initialize(LE); itl.More(); itl.Next()) {
-+      const TopoDS_Edge& E = TopoDS::Edge(itl.Value());
-+      if (E.IsSame(CE))
-+        continue;
-+      if (! CV.IsSame( TopExp::FirstVertex( E, Standard_True )))
-+        continue;
-+
-+      isForward = ( E.Orientation () == TopAbs_FORWARD );
-+
-+      // get E curve
-+      C = BRep_Tool::CurveOnSurface(E,FForward,f,l);
-+      // get the first derivative Tg1
-+      u = isForward ? ( f + du ) : ( l - du );
-+      C->D1(u, P, Tg1);
-+      if (!isForward) Tg1.Reverse();
-+
-+      // -PI < angle < PI
-+      Standard_Real angle = Tg1.Angle(CTg1);
-+
-+      if (PI - Abs(angle) <= tolAng)
-+      {
-+        // an angle is too close to PI; assure that an angle sign really
-+        // reflects an edge position: +PI - an edge is worst,
-+        // -PI - an edge is best.
-+        u = preciseU( Surf, CE, CV, Cc, Standard_False);
-+        gp_Vec2d CTg;
-+        Cc->D1(u, PC, CTg);
-+        if (CE.Orientation() == TopAbs_REVERSED) CTg.Reverse();
-+
-+        u = preciseU( Surf, E, CV, C, Standard_True);
-+        C->D1(u, P, Tg1);
-+        if (!isForward) Tg1.Reverse();
-+
-+        angle = Tg1.Angle(CTg);
-+      }
-+
-+      Standard_Boolean isClose = ( Abs( angle - anglemin ) <= tolAng );
-+      if (angle <= anglemin) {
-+        if (isClose)
-+          aPrevNE = NE;
-+        else
-+          aPrevNE.Nullify();
-+        anglemin = angle ;
-+        NE = E;
-+      }
-+      else
-+        if (isClose)
-+          aPrevNE = E;
-+
-+    }
-+    if (!aPrevNE.IsNull()) {
-+      // select one of close edges, the most left one.
-+      Cc = BRep_Tool::CurveOnSurface( NE, FForward, f, l );
-+      uc = preciseU( Surf, NE, CV, Cc, Standard_True);
-+      Cc->D1(uc, PC, CTg1);
-+      if (NE.Orientation() != TopAbs_FORWARD) CTg1.Reverse();
-+      
-+      u = preciseU( Surf, aPrevNE, CV, C, Standard_True);
-+      C->D1(u, P, Tg1);
-+      if (aPrevNE.Orientation() != TopAbs_FORWARD) Tg1.Reverse();
-+
-+      if ( Tg1.Angle(CTg1) < 0)
-+        NE = aPrevNE;
-+    }
-+  }
-+  else if (LE.Extent() == 1) {
-+    NE = TopoDS::Edge(LE.First());
-+  }
-+  else {
-+    return Standard_False;
-+  }
-+  return !NE.IsNull();
-+}
-+
-+//=======================================================================
-+//function : SamePnt2d
-+//purpose  :
-+//=======================================================================
-+
-+static Standard_Boolean  SamePnt2d(const TopoDS_Vertex& V1,
-+                                   const TopoDS_Edge&   E1,
-+                                   const TopoDS_Vertex& V2,
-+                                   const TopoDS_Edge&   E2,
-+                                   const TopoDS_Face&   F)
-+{
-+  Standard_Real   f1,f2,l1,l2;
-+  Handle(Geom2d_Curve) C1 = BRep_Tool::CurveOnSurface(E1,F,f1,l1);
-+  Handle(Geom2d_Curve) C2 = BRep_Tool::CurveOnSurface(E2,F,f2,l2);
-+
-+  gp_Pnt2d P1 = C1->Value( BRep_Tool::Parameter(V1,E1));
-+  gp_Pnt2d P2 = C2->Value( BRep_Tool::Parameter(V2,E2));
-+
-+  Standard_Real Tol  = 100 * BRep_Tool::Tolerance(V1);
-+  Standard_Real Dist = P1.Distance(P2);
-+  return Dist < Tol;
-+}
-+
-+
-+//=======================================================================
-+//function : StoreInMVE
-+//purpose  :
-+//=======================================================================
-+
-+static void StoreInMVE (const TopoDS_Face& /*F*/,
-+                        TopoDS_Edge& E,
-+                        TopTools_DataMapOfShapeListOfShape& MVE )
-+
-+{
-+  TopoDS_Vertex V1, V2;
-+  TopTools_ListOfShape Empty;
-+
-+  TopExp::Vertices(E,V1,V2);
-+  if (!MVE.IsBound(V1)) {
-+    MVE.Bind(V1,Empty);
-+  }
-+  MVE(V1).Append(E);
-+
-+  if (!MVE.IsBound(V2)) {
-+    MVE.Bind(V2,Empty);
-+  }
-+  MVE(V2).Append(E);
-+}
-+
-+//=======================================================================
-+//function : RemoveFromMVE
-+//purpose  :
-+//=======================================================================
-+
-+static void RemoveFromMVE(const TopoDS_Edge& E,
-+                          TopTools_DataMapOfShapeListOfShape& MVE)
-+{
-+  TopTools_ListIteratorOfListOfShape itl;
-+  TopoDS_Vertex  V1,V2;
-+  TopExp::Vertices (E,V1,V2);
-+  if (MVE.IsBound(V1))
-+    for ( itl.Initialize(MVE(V1)); itl.More(); itl.Next()) {
-+      if (itl.Value().IsEqual(E)) {
-+        MVE(V1).Remove(itl);
-+        break;
-+      }
-+    }
-+  if (MVE.IsBound(V2))
-+    for ( itl.Initialize(MVE(V2)); itl.More(); itl.Next()) {
-+      if (itl.Value().IsEqual(E)) {
-+        MVE(V2).Remove(itl);
-+        break;
-+      }
-+    }
-+}
-+//=======================================================================
-+//function : addConnected
-+//purpose  : add to <EM> all edges reachable from <E>
-+//=======================================================================
-+
-+static void addConnected(const TopoDS_Shape& E,
-+                         TopTools_MapOfShape& EM,
-+                         TopTools_MapOfShape& VM,
-+                         const TopTools_DataMapOfShapeListOfShape& MVE)
-+{
-+  // Loop on vertices of E
-+  TopoDS_Iterator itV ( E );
-+  for ( ; itV.More(); itV.Next()) {
-+
-+    if ( ! VM.Add ( itV.Value() )) continue;
-+
-+    // Loop on edges sharing V
-+    TopTools_ListIteratorOfListOfShape itE( MVE( itV.Value() ) );
-+    for (; itE.More(); itE.Next()) {
-+      if ( EM.Add( itE.Value() ))
-+        addConnected ( itE.Value(), EM, VM, MVE );
-+    }
-+  }
-+}
-+//=======================================================================
-+//function : canPassToOld
-+//purpose  :
-+//=======================================================================
-+
-+// static Standard_Boolean canPassToOld (const TopoDS_Shape& V,
-+//                                    TopTools_MapOfShape& UsedShapesMap,
-+//                                    const TopTools_DataMapOfShapeListOfShape& MVE,
-+//                                    const TopTools_MapOfShape& SectionEdgesMap)
-+// {
-+//   TopTools_ListIteratorOfListOfShape itE( MVE(V) );
-+//   // Loop on edges sharing V
-+//   for (; itE.More(); itE.Next()) {
-+//     if ( !UsedShapesMap.Add( itE.Value() ))
-+//       continue; // already checked
-+
-+//     if ( !SectionEdgesMap.Contains( itE.Value() ))
-+//       return Standard_True; // WE PASSED
-+
-+//     TopoDS_Iterator itV( itE.Value() );
-+//     // Loop on vertices of an edge
-+//     for (; itV.More(); itV.Next()) {
-+//       if ( !UsedShapesMap.Add( itV.Value() ))
-+//      continue; // already checked
-+//       else
-+//      return canPassToOld( itV.Value(), UsedShapesMap, MVE, SectionEdgesMap);
-+//     }
-+//   }
-+//   return Standard_False;
-+// }
-+
-+//=======================================================================
-+//function : MakeDegenAndSelect
-+//purpose  : Find parameter of intersection of <CE> with <DE> and
-+//           select an edge with its parameter closest to found one.
-+//           Return new degenerated edge trimming <DE> by found parameters
-+//=======================================================================
-+
-+static TopoDS_Edge MakeDegenAndSelect(const TopoDS_Edge& CE,
-+                                      const TopoDS_Vertex& CV,
-+                                      TopoDS_Edge& NE,
-+                                      TopTools_SequenceOfShape& EdgesSeq,
-+                                      TColStd_SequenceOfReal& USeq,
-+                                      const TopoDS_Edge& DE)
-+{
-+  if (EdgesSeq.Length() < 3) {
-+    if (CE == EdgesSeq.First())
-+      NE = TopoDS::Edge( EdgesSeq.Last() );
-+    else
-+      NE = TopoDS::Edge( EdgesSeq.First() );
-+    return DE;
-+  }
-+
-+  // find parameter on DE where it intersects CE
-+
-+  Standard_Real U1;
-+  Standard_Integer i, nb = EdgesSeq.Length();
-+  for (i=1; i<= nb; ++i) {
-+    if (CE == EdgesSeq(i)) {
-+      U1 = USeq(i);
-+      break;
-+    }
-+  }
-+
-+  // select NE with param closest to U1 thus finding U2 for a new degen edge
-+
-+  Standard_Real U2, dU, dUmin = 1.e100;
-+  Standard_Boolean isReversed = ( DE.Orientation() == TopAbs_REVERSED );
-+  for (i=1; i<= nb; ++i) {
-+    dU = USeq(i) - U1;
-+    if (isReversed ? (dU > 0) : (dU < 0))
-+        continue;
-+    dU = Abs( dU );
-+    if ( dU  > dUmin || IsEqual( dU, 0.))
-+      continue;
-+    const TopoDS_Edge& E = TopoDS::Edge ( EdgesSeq(i) );
-+    if ( ! CV.IsSame( TopExp::FirstVertex( E , Standard_True )))
-+      continue;
-+    NE = E;
-+    dUmin = dU + Epsilon(dU);
-+    U2 = USeq(i);
-+  }
-+
-+  // make a new degenerated edge
-+  TopoDS_Edge NewDegen = TopoDS::Edge ( DE.EmptyCopied() );
-+
-+  Standard_Real Tol = BRep_Tool::Tolerance( CV );
-+  TopoDS_Vertex V = CV;
-+
-+  BRep_Builder B;
-+  V.Orientation( NewDegen.Orientation() );
-+  B.UpdateVertex( V, U1, NewDegen, Tol);
-+  B.Add ( NewDegen , V );
-+
-+  V.Reverse();
-+  B.UpdateVertex( V, U2, NewDegen, Tol);
-+  B.Add ( NewDegen , V );
-+
-+  return NewDegen;
-+}
-+
-+//=======================================================================
-+//function : prepareDegen
-+//purpose  : Intersect <DegEdge> with edges bound to its vertex in <MVE>
-+//           and store intersection parameter on <DegEdge> in
-+//           <USeq> as well as the edges them-self in <EdgesSeq>.
-+//           Bind <DegEdgeIndex> to vertex of <DegEdge> in <MVDEI>
-+//=======================================================================
-+
-+static void prepareDegen (const TopoDS_Edge&                        DegEdge,
-+                          const TopoDS_Face&                        F,
-+                          const TopTools_DataMapOfShapeListOfShape& MVE,
-+                          TopTools_SequenceOfShape&                 EdgesSeq,
-+                          TColStd_SequenceOfReal&                   USeq,
-+                          TopTools_DataMapOfShapeInteger&           MVDEI,
-+                          const Standard_Integer                    DegEdgeIndex)
-+{
-+  const TopoDS_Vertex& V = TopExp::FirstVertex ( DegEdge );
-+  MVDEI.Bind ( V, DegEdgeIndex );
-+
-+  const TopTools_ListOfShape& EdgesList = MVE ( V );
-+  // if only 2 edges come to degenerated one, no pb in selection and
-+  // no need to intersect them, just simulate asked data
-+  Standard_Boolean doIntersect =  ( EdgesList.Extent() > 2 );
-+
-+  BRepAdaptor_Curve2d DC, C;
-+  Geom2dInt_GInter InterCC;
-+  Standard_Real Tol = Precision::PConfusion();
-+  if ( doIntersect )
-+    DC.Initialize( DegEdge, F );
-+
-+  // avoid intersecting twice the same edge
-+  BRepOffset_DataMapOfShapeReal EUMap ( EdgesList.Extent() );
-+
-+  Standard_Real U, f, l;
-+  BRep_Tool::Range (DegEdge, f, l);
-+
-+  TopTools_ListIteratorOfListOfShape itE (EdgesList);
-+  for (; itE.More(); itE.Next()) {
-+
-+    const TopoDS_Edge& E = TopoDS::Edge ( itE.Value() );
-+
-+    if ( !doIntersect) {
-+      U = 0.; // it won't be used
-+    }
-+    else if ( BRep_Tool::IsClosed( E, F )) {
-+      // seam edge: select U among f and l
-+      Standard_Boolean first = Standard_True;
-+      if ( V.IsSame ( TopExp::FirstVertex( E, Standard_True ) ))
-+        first = Standard_False;
-+      if ( DegEdge.Orientation() == TopAbs_REVERSED )
-+        first = !first;
-+      U = first ? f : l;
-+    }
-+    else if ( EUMap.IsBound( E ) ) {
-+      // same edge already bound
-+      U = EUMap( E );
-+    }
-+    else {
-+      // intersect 2d curves
-+      C.Initialize( E, F );
-+      InterCC.Perform ( DC, C , Tol, Tol );
-+      if (! InterCC.IsDone() || InterCC.NbPoints() == 0) {
-+        MESSAGE ( "NO 2d INTERSECTION ON DEGENERATED EDGE" );
-+        continue;
-+      }
-+      // hope there is only one point of intersection
-+      U = InterCC.Point( 1 ).ParamOnFirst();
-+    }
-+    USeq.Append ( U );
-+    EdgesSeq.Append ( E );
-+  }
-+}
-+//=======================================================================
-+//function : Perform
-+//purpose  : Make loops.
-+//=======================================================================
-+
-+void Partition_Loop2d::Perform()
-+{
-+
-+  Standard_Integer NbConstEdges = myConstEdges.Extent();
-+  TopTools_DataMapOfShapeListOfShape MVE(NbConstEdges) , MVE2(NbConstEdges);
-+  TopTools_DataMapIteratorOfDataMapOfShapeListOfShape Mapit;
-+  TopTools_ListIteratorOfListOfShape itl;
-+  TopoDS_Vertex V1,V2;
-+  BRepAdaptor_Surface Surface ( myFace, Standard_False );
-+
-+  // degenerated edges and parameters of their 2d intersection with other edges
-+  TopoDS_Edge                    DE [2];
-+  TopTools_SequenceOfShape       SEID [2]; // seq of edges intersecting degenerated
-+  TColStd_SequenceOfReal         SeqU [2]; // n-th U corresponds to n-th edge in SEID
-+  TopTools_DataMapOfShapeInteger MVDEI(2); // map vertex - degenerated edge index
-+  Standard_Integer               iDeg = 0; // index of degenerated edge [0,1]
-+
-+  //---------------------------------------------------------
-+  // Construction map vertex => edges, find degenerated edges
-+  //---------------------------------------------------------
-+  for (itl.Initialize(myConstEdges); itl.More(); itl.Next()) {
-+    TopoDS_Edge& E = TopoDS::Edge(itl.Value());
-+    if ( BRep_Tool::Degenerated( E )) {
-+      if (DE[0].IsNull()) DE[0] = E;
-+      else                DE[1] = E;
-+    }
-+    else
-+      StoreInMVE(myFace,E,MVE);
-+  }
-+
-+  // fill data for degenerated edges
-+  if ( ! DE[0].IsNull() )
-+    prepareDegen ( DE[0], myFace, MVE, SEID[0], SeqU[0], MVDEI, 0);
-+  if ( ! DE[1].IsNull() )
-+    prepareDegen ( DE[1], myFace, MVE, SEID[1], SeqU[1], MVDEI, 1);
-+
-+
-+  // to detect internal wires
-+  Standard_Boolean isInternCW = 0;
-+  MVE2 = MVE;
-+
-+
-+  //------------------------------
-+  // Construction of all the wires
-+  //------------------------------
-+  // first, we collect wire edges in WEL list looking for same edges that
-+  // will be then removed possibly exploding a wire into parts;
-+  // second, build wire(s)
-+
-+  while (!MVE.IsEmpty()) {
-+
-+    TopoDS_Vertex    VF,CV;
-+    TopoDS_Edge      CE,NE,EF;
-+    TopoDS_Wire      NW;
-+    BRep_Builder     B;
-+    Standard_Boolean End = Standard_False;
-+    TopTools_ListOfShape WEL;
-+
-+    Mapit.Initialize(MVE);
-+    if (Mapit.Value().IsEmpty()) {
-+      MVE.UnBind(Mapit.Key());
-+      continue;
-+    }
-+
-+    // EF first edge.
-+    EF = CE = TopoDS::Edge(Mapit.Value().First());
-+    // VF first vertex
-+    VF = TopExp::FirstVertex( CE, Standard_True);
-+
-+    isInternCW = Standard_True;
-+
-+    TopTools_MapOfShape addedEM  (NbConstEdges); // map of edges added to WEL
-+    TopTools_MapOfShape doubleEM (NbConstEdges); // edges encountered twice in WEL
-+
-+    //-------------------------------
-+    // Construction of a wire.
-+    //-------------------------------
-+    while (!End) {
-+
-+      // only a seam is allowed twice in a wire, the others should be removed
-+      if (addedEM.Add ( CE ) || BRep_Tool::IsClosed( CE, myFace ) )
-+        WEL.Append( CE );
-+      else {
-+        doubleEM.Add( CE );
-+        RemoveFromMVE (CE,MVE2);
-+        TopoDS_Edge CERev = CE;
-+        CERev.Reverse();
-+        RemoveFromMVE (CERev,MVE2);
-+      }
-+
-+      RemoveFromMVE (CE,MVE);
-+
-+      CV = TopExp::LastVertex( CE, Standard_True);
-+
-+      if (isInternCW && !mySectionEdges.Contains(CE))
-+        // wire is internal if all edges are section ones
-+        isInternCW = Standard_False;
-+
-+      if (MVDEI.IsBound( CV )) { // CE comes to the degeneration
-+        iDeg = MVDEI( CV );
-+        TopoDS_Edge NewDegen;
-+        NewDegen = MakeDegenAndSelect( CE, CV, NE, SEID[iDeg], SeqU[iDeg], DE[iDeg]);
-+        WEL.Append( NewDegen );
-+        CE = NE;
-+        End = CV.IsSame( VF );
-+        continue;
-+      }
-+
-+      //--------------
-+      // stop test
-+      //--------------
-+      if (MVE(CV).IsEmpty()) {
-+        End=Standard_True;
-+        MVE.UnBind(CV);
-+      }
-+      else if (CV.IsSame(VF) && SamePnt2d(CV,CE, VF,EF, myFace) ) {
-+        End = Standard_True;
-+      }
-+      else {
-+        //----------------------------
-+        // select new current edge
-+        //----------------------------
-+        if (! SelectEdge (Surface,CE,CV,NE,MVE(CV))) {
-+          MESSAGE ( " NOT CLOSED WIRE " );
-+          End=Standard_True;
-+        }
-+        else
-+          CE = NE;
-+      }
-+    } // while ( !End )
-+
-+
-+    // WEL is built, built wire(s)
-+
-+
-+    itl.Initialize( WEL );
-+    if ( doubleEM.IsEmpty()) { // no double edges
-+      B.MakeWire( NW );
-+      for (; itl.More(); itl.Next())
-+        B.Add ( NW, itl.Value());
-+      if (isInternCW) myInternalWL.Append(NW);
-+      else            myNewWires.Append  (NW);
-+    }
-+
-+    else {
-+      // remove double and degenerated edges from WEL
-+      while (itl.More()) {
-+        const TopoDS_Edge& E = TopoDS::Edge ( itl.Value() );
-+        if ( doubleEM.Contains( E ) || BRep_Tool::Degenerated( E ))
-+          WEL.Remove( itl );
-+        else
-+           itl.Next();
-+      }
-+      if ( WEL.IsEmpty())
-+        continue;
-+      // remove double edges from SEID and SeqU
-+      Standard_Integer i,j;
-+      for (j=0; j<2; ++j) {
-+        for (i=1; i<=SEID[j].Length(); ++i) {
-+          if (doubleEM.Contains( SEID[j].Value(i))) {
-+            SEID[j].Remove( i );
-+            SeqU[j].Remove( i-- );
-+          }
-+        }
-+      }
-+      // removal of doulbe edges can explode a wire into parts,
-+      // make new wires of them.
-+      // A Loop like previous one but without 2d check
-+      while ( !WEL.IsEmpty() ) {
-+        CE = TopoDS::Edge( WEL.First() );
-+        WEL.RemoveFirst();
-+        B.MakeWire( NW );
-+        VF = TopExp::FirstVertex ( CE, Standard_True);
-+
-+        End = Standard_False;
-+        while ( !End) {
-+          B.Add( NW, CE );
-+          CV = TopExp::LastVertex  ( CE, Standard_True);
-+
-+          if (MVDEI.IsBound( CV )) {   // CE comes to the degeneration
-+            iDeg = MVDEI( CV );
-+            TopoDS_Edge NewDegen;
-+            NewDegen = MakeDegenAndSelect( CE, CV, NE, SEID[iDeg], SeqU[iDeg], DE[iDeg]);
-+            B.Add( NW, NewDegen );
-+            End = CV.IsSame( VF );
-+            CE = NE;
-+            if (!NE.IsNull()) { // remove NE from WEL
-+              for (itl.Initialize( WEL ); itl.More(); itl.Next())
-+                if ( NE == itl.Value()) {
-+                  WEL.Remove( itl );
-+                  break;
-+                }
-+            }
-+          }  // end degeneration
-+
-+          else {
-+            if (CV.IsSame( VF )) {
-+              End = Standard_True;
-+              continue;
-+            }
-+            // edges in WEL most often are well ordered
-+            // so try to iterate until the End
-+            Standard_Boolean add = Standard_False;
-+            itl.Initialize(WEL);
-+            while ( itl.More() && !End) {
-+              NE = TopoDS::Edge( itl.Value() );
-+              if ( CV.IsSame( TopExp::FirstVertex( NE, Standard_True ))) {
-+                WEL.Remove( itl );
-+                if (add)
-+                  B.Add( NW, CE );
-+                CE = NE;
-+                add = Standard_True;
-+                CV = TopExp::LastVertex( CE, Standard_True);
-+                if (MVDEI.IsBound( CV ) || CV.IsSame( VF ))
-+                  break;
-+              }
-+              else
-+                itl.Next();
-+            }
-+            if (!add)
-+              End = Standard_True;
-+          }
-+        } // !End
-+
-+        myInternalWL.Append( NW );
-+      }
-+    } // end building new wire(s) from WEL
-+
-+  } // end Loop on MVE
-+
-+  // all wires are built
-+
-+
-+  // ============================================================
-+  // select really internal wires i.e. those from which we can`t
-+  // pass to an old (not section) edge
-+  // ============================================================
-+
-+  Standard_Integer nbIW = myInternalWL.Extent();
-+  if (nbIW == 0)
-+    return;
-+
-+  if ( myNewWires.Extent() != 1 && nbIW > 1) {
-+    TopTools_MapOfShape outerEM (NbConstEdges); // edges connected to non-section ones
-+    TopTools_MapOfShape visitedVM (NbConstEdges);
-+    for ( itl.Initialize( myConstEdges ); itl.More(); itl.Next()) {
-+      if ( ! mySectionEdges.Contains( itl.Value() ))
-+        addConnected (itl.Value(), outerEM, visitedVM, MVE2);
-+    }
-+    // if an edge of a wire is in <outerEM>, the wire is not internal
-+    TopExp_Explorer expIWE;
-+    TopTools_ListIteratorOfListOfShape itIW ( myInternalWL );
-+    while (itIW.More()) {
-+      expIWE.Init ( itIW.Value() , TopAbs_EDGE );
-+      if ( outerEM.Contains( expIWE.Current() )) {
-+        myNewWires.Append ( itIW.Value() );
-+        myInternalWL.Remove( itIW ); // == itIW.Next()
-+      }
-+      else
-+        itIW.Next();
-+    }
-+  }
-+}
-+//=======================================================================
-+//function : isHole
-+//purpose  :
-+//=======================================================================
-+
-+static Standard_Boolean isHole (const TopoDS_Wire& W,
-+                                const TopoDS_Face& F)
-+{
-+  BRep_Builder B;
-+  TopoDS_Shape newFace = F.EmptyCopied();
-+  B.Add(newFace,W.Oriented(TopAbs_FORWARD));
-+  BRepTopAdaptor_FClass2d classif (TopoDS::Face(newFace),
-+                                   Precision::PConfusion());
-+  return (classif.PerformInfinitePoint() == TopAbs_IN);
-+}
-+
-+//=======================================================================
-+//function : IsInside
-+//purpose  : check if W1 is inside W2. Suppose W2 is not a hole !!!!
-+//=======================================================================
-+
-+static Standard_Boolean isInside(const TopoDS_Face& F,
-+                                 const TopoDS_Wire& W1,
-+                                 const TopoDS_Wire& W2)
-+{
-+  // make a face with wire W2
-+  BRep_Builder B;
-+  TopoDS_Shape aLocalShape = F.EmptyCopied();
-+  TopoDS_Face newFace = TopoDS::Face(aLocalShape);
-+  B.Add(newFace,W2);
-+
-+  // get any 2d point of W1
-+  TopExp_Explorer exp(W1,TopAbs_EDGE);
-+  if (BRep_Tool::Degenerated( TopoDS::Edge( exp.Current() )))
-+    exp.Next();
-+  const TopoDS_Edge& e = TopoDS::Edge(exp.Current());
-+  Standard_Real f,l;
-+  Handle(Geom2d_Curve) C2d = BRep_Tool::CurveOnSurface(e,F,f,l);
-+  gp_Pnt2d pt2d(C2d->Value( 0.5 * ( f + l )));
-+
-+  BRepTopAdaptor_FClass2d classif(newFace,Precision::PConfusion());
-+  return (classif.Perform(pt2d) == TopAbs_IN);
-+}
-+
-+//=======================================================================
-+//function : NewWires
-+//purpose  : Returns the list of wires performed.
-+//           can be an empty list.
-+//=======================================================================
-+
-+const TopTools_ListOfShape&  Partition_Loop2d::NewWires() const
-+{
-+  return myNewWires;
-+}
-+
-+//=======================================================================
-+//function : NewFaces
-+//purpose  : Returns the list of faces.
-+//Warning  : The method <WiresToFaces> as to be called before.
-+//           can be an empty list.
-+//=======================================================================
-+
-+const TopTools_ListOfShape&  Partition_Loop2d::NewFaces() const
-+{
-+  return myNewFaces;
-+}
-+
-+//=======================================================================
-+//function : findEqual
-+//purpose  : move wires form <WL> to <EqWL> pairs of wires build of the same edges
-+//=======================================================================
-+
-+static void findEqual (TopTools_ListOfShape& WL,
-+                       TopTools_DataMapOfShapeShape& EqWM,
-+                       const TopoDS_Face& F)
-+{
-+  TopTools_ListIteratorOfListOfShape it1, it2;
-+  Standard_Integer i,j;
-+  TColStd_MapOfInteger IndMap;
-+  for (it1.Initialize(WL), i=1;  it1.More();  it1.Next(), i++) {
-+
-+    if (IndMap.Contains(i)) continue;
-+    const TopoDS_Wire& Wire1 = TopoDS::Wire( it1.Value());
-+
-+    for (it2.Initialize(WL), j=1;  it2.More();  it2.Next(), j++) {
-+
-+      if (j <= i || IndMap.Contains(j)) continue;
-+
-+      TopTools_IndexedMapOfShape EdgesMap;
-+      TopExp::MapShapes (Wire1, TopAbs_EDGE, EdgesMap);
-+
-+      const TopoDS_Shape& Wire2 = it2.Value();
-+      TopoDS_Iterator itE ( Wire2);
-+      for (; itE.More(); itE.Next()) {
-+        if ( !EdgesMap.Contains( itE.Value()) )
-+          break;
-+      }
-+      if (!itE.More()) { // all edges are same
-+        if (isHole( Wire1, F)) {
-+          EqWM.Bind ( Wire1, Wire2 );
-+        }
-+        else {
-+          EqWM.Bind ( Wire2, Wire1 );
-+        }
-+        IndMap.Add(i);
-+        IndMap.Add(j);
-+        break;
-+      }
-+    }
-+  }
-+  // clear WL
-+  it1.Initialize(WL);
-+  i=1;
-+  while (it1.More()) {
-+    if (IndMap.Contains(i))
-+      WL.Remove(it1); // next node becomes current and with Next() we would miss it
-+    else
-+      it1.Next();
-+    i++;
-+  }
-+}
-+
-+//=======================================================================
-+//function : classify
-+//purpose  : bind to a wire a list of internal wires
-+//=======================================================================
-+
-+static void classify(const TopTools_DataMapOfShapeShape& EqWM,
-+                     BRepAlgo_AsDes& OuterInner,
-+                     const TopoDS_Face& F)
-+{
-+  TopTools_DataMapIteratorOfDataMapOfShapeShape it1, it2;
-+
-+  for (it1.Initialize(EqWM);  it1.More();  it1.Next()) {
-+    // find next after it1.Value()
-+    for (it2.Initialize(EqWM);  it2.More();  it2.Next())
-+      if (it1.Value().IsSame( it2.Value() ))
-+      {
-+        it2.Next();
-+        break;
-+      }
-+    for ( ;  it2.More();  it2.Next()) {
-+      const TopoDS_Wire& Wire1 = TopoDS::Wire( it1.Value() );
-+      const TopoDS_Wire& Wire2 = TopoDS::Wire( it2.Value() );
-+      if (isInside(F, Wire1, Wire2))
-+        OuterInner.Add (Wire2, Wire1);
-+      else if (isInside(F, Wire2, Wire1))
-+        OuterInner.Add (Wire1, Wire2);
-+    }
-+  }
-+}
-+//=======================================================================
-+//function : WiresToFaces
-+//purpose  : Build faces from the wires result.
-+//           <EdgeImage> serves to  find  original edge by new
-+//           one. <Section> contains edges resulting from face
-+//           intersections
-+//=======================================================================
-+
-+void  Partition_Loop2d::WiresToFaces(const BRepAlgo_Image& )
-+{
-+  Standard_Integer nbW = myNewWires.Extent() + myInternalWL.Extent();
-+  if (nbW==0)
-+    return;
-+
-+  BRepAlgo_FaceRestrictor FR;
-+  FR.Init (myFace,Standard_False);
-+
-+  // FaceRestrictor is instable in rather simple cases
-+  // (ex. a single face of bellecoque.brep splited by 10 planes:
-+  // sometimes 1-2 faces are missing ).
-+  // So we use it as less as possible: no holes -> make faces by hands
-+
-+
-+  // are there holes in myFace ?
-+  Standard_Boolean hasOldHoles = Standard_False;
-+  TopoDS_Iterator itOldW (myFace);
-+  if ( itOldW.More()) {
-+    const TopoDS_Wire& FirstOldWire = TopoDS::Wire( itOldW.Value() );
-+    itOldW.Next();
-+    hasOldHoles = itOldW.More() || isHole( FirstOldWire, myFace);
-+  }
-+  if (myInternalWL.IsEmpty() && !hasOldHoles) {
-+    // each wire bounds one face
-+    BRep_Builder B;
-+    TopTools_ListIteratorOfListOfShape itNW (myNewWires);
-+    for (; itNW.More(); itNW.Next()) {
-+      TopoDS_Face NF = TopoDS::Face ( myFace.EmptyCopied() );
-+      B.Add ( NF, itNW.Value() );
-+      NF.Orientation( myFaceOri);
-+      myNewFaces.Append ( NF );
-+    }
-+    return;
-+  }
-+
-+  // FaceRestrictor can't classify wires build on all the same edges
-+  // and gives incorrect result in such cases (ex. a plane cut into 2 parts by cylinder)
-+  // We must make faces of equal wires separately. One of equal wires makes a
-+  // hole in a face and should come together with outer wires of face.
-+  // The other of a wires pair bounds a face that may have holes in turn.
-+
-+  // Find equal wires among internal wires
-+  TopTools_DataMapOfShapeShape EqWM; // key is a hole part of a pair of equal wires
-+  findEqual (myInternalWL, EqWM, myFace);
-+
-+  if (!EqWM.IsEmpty()) { // there are equal wires
-+
-+    if (hasOldHoles)
-+      myInternalWL.Append( myNewWires ); // an old wire can be inside an equal wire
-+
-+    // classify equal wire pairs
-+    BRepAlgo_AsDes OuterInner;
-+    classify (EqWM,OuterInner,myFace);
-+
-+    // make face of most internal of equal wires and its inner wires
-+    while ( !EqWM.IsEmpty()) {
-+
-+      TopTools_ListOfShape prevHolesL; // list of hole-part of previous most internal equal wires
-+
-+      // find most internal wires among pairs (key - hole, value - outer part)
-+      TopTools_DataMapIteratorOfDataMapOfShapeShape it(EqWM);
-+      Standard_Integer nbEqW = EqWM.Extent(); // protection against infinite loop
-+      for ( ; it.More(); it.Next()) {
-+
-+        TopoDS_Wire outerW = TopoDS::Wire ( it.Value() );
-+        if (  OuterInner.HasDescendant( outerW ) && // has internal
-+             ! OuterInner.Descendant( outerW ).IsEmpty() )
-+          continue;
-+
-+        FR.Add( outerW );
-+
-+        // add internal wires that are inside of outerW
-+        TopTools_ListIteratorOfListOfShape itIW (myInternalWL);
-+        while ( itIW.More()) {
-+          TopoDS_Wire IW = TopoDS::Wire ( itIW.Value() );
-+          if ( isInside (myFace, IW, outerW)) {
-+            FR.Add (IW);
-+            myInternalWL.Remove( itIW ); // == itIW.Next() !!!
-+          }
-+          else
-+            itIW.Next();
-+        }
-+
-+        // the hole-part of current pair of equal wires will be in the next new face
-+        prevHolesL.Append ( it.Key() );
-+
-+      } // Loop on map of equal pairs searching for innermost wires
-+
-+      // make faces
-+      FR.Perform();
-+      if (FR.IsDone()) {
-+        for (; FR.More(); FR.Next())
-+          myNewFaces.Append(FR.Current());
-+      }
-+
-+      FR.Clear();
-+
-+      // add hole-parts to FaceRestrictor,
-+      // remove them from the EqWM,
-+      // remove found wires as internal of resting classified wires
-+      Standard_Boolean clearOuterInner =  ( prevHolesL.Extent() < EqWM.Extent() );
-+      TopTools_ListIteratorOfListOfShape itPrev (prevHolesL);
-+      for (; itPrev.More(); itPrev.Next()) {
-+        TopoDS_Wire& Hole = TopoDS::Wire ( itPrev.Value() );
-+        FR.Add ( Hole );
-+        if (clearOuterInner) {
-+          const TopoDS_Wire& outerW = TopoDS::Wire ( EqWM.Find( Hole ) );
-+          // Loop on wires including outerW
-+          TopTools_ListIteratorOfListOfShape itO( OuterInner.Ascendant( outerW ));
-+          for (; itO.More(); itO.Next()) {
-+            TopTools_ListOfShape& innerL = OuterInner.ChangeDescendant( itO.Value() );
-+            TopTools_ListIteratorOfListOfShape itI (innerL);
-+            // Loop on internal wires of current including wire
-+            for (; itI.More(); itI.Next())
-+              if ( outerW.IsSame( itI.Value() )) {
-+                innerL.Remove( itI );   break;
-+              }
-+          }
-+        }
-+        EqWM.UnBind ( Hole );
-+      }
-+
-+      if (nbEqW == EqWM.Extent())
-+      {
-+        // error: pb with wires classification
-+#ifdef DEB
-+        MESSAGE("Partition_Loop2d::WiresToFaces(), pb with wires classification");
-+#endif
-+        break;
-+      }
-+
-+    } // while (!EqWM.IsEmpty)
-+
-+  } //  if !EqWM.IsEmpty()
-+
-+  myNewWires.Append ( myInternalWL );
-+
-+  TopTools_ListIteratorOfListOfShape itW (myNewWires);
-+  for (; itW.More(); itW.Next()) {
-+    TopoDS_Wire& W = TopoDS::Wire ( itW.Value() );
-+    FR.Add(W);
-+  }
-+  FR.Perform();
-+  for (; FR.IsDone() && FR.More(); FR.Next())
-+    myNewFaces.Append(FR.Current());
-+
-+
-+  TopTools_ListIteratorOfListOfShape itNF (myNewFaces);
-+  for (; itNF.More(); itNF.Next())
-+    itNF.Value().Orientation( myFaceOri );
-+}
-+
-+#endif
-diff -Naur --exclude=CVS netgen-4.5_orig/libsrc/occ/Partition_Loop3d.cxx netgen-4.5_new/libsrc/occ/Partition_Loop3d.cxx
---- netgen-4.5_orig/libsrc/occ/Partition_Loop3d.cxx    2005-06-09 18:51:10.000000000 +0400
-+++ netgen-4.5_new/libsrc/occ/Partition_Loop3d.cxx     2010-06-23 13:19:48.000000000 +0400
-@@ -10,6 +10,11 @@
- //  Module : GEOM
- //using namespace std;
-+
-+
-+
-+#include "utilities.h"
-+
- #include "Partition_Loop3d.ixx"
- #include <TopExp_Explorer.hxx>
-diff -Naur --exclude=CVS netgen-4.5_orig/libsrc/occ/Partition_Spliter.cxx netgen-4.5_new/libsrc/occ/Partition_Spliter.cxx
---- netgen-4.5_orig/libsrc/occ/Partition_Spliter.cxx   2005-07-11 10:33:27.000000000 +0400
-+++ netgen-4.5_new/libsrc/occ/Partition_Spliter.cxx    2010-06-23 13:19:48.000000000 +0400
-@@ -29,14 +29,15 @@
- //  $Header$
- //using namespace std;
-+
-+#include "utilities.h"
-+
- #include "Partition_Inter2d.hxx"
- #include "Partition_Inter3d.hxx"
- #include "Partition_Loop2d.hxx"
- #include "Partition_Loop3d.hxx"
- #include "Partition_Spliter.ixx"
+ #include "Partition_Inter2d.hxx"
+ #include "Partition_Inter3d.hxx"
+ #include "Partition_Loop2d.hxx"
+ #include "Partition_Loop3d.hxx"
+ #include "Partition_Spliter.ixx"
  
 -#include "utilities.h"
 -
  #include <Precision.hxx>
  #include <TopAbs_Orientation.hxx>
  #include <TopExp.hxx>
-diff -Naur --exclude=CVS netgen-4.5_orig/libsrc/occ/Partition_Spliter.cxx.orig netgen-4.5_new/libsrc/occ/Partition_Spliter.cxx.orig
---- netgen-4.5_orig/libsrc/occ/Partition_Spliter.cxx.orig      1970-01-01 03:00:00.000000000 +0300
-+++ netgen-4.5_new/libsrc/occ/Partition_Spliter.cxx.orig       2010-06-23 13:19:48.000000000 +0400
-@@ -0,0 +1,2166 @@
-+#ifdef OCCGEOMETRY
-+
-+//  GEOM PARTITION : partition algorithm
-+//
-+//  Copyright (C) 2003  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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
-+//
-+//
-+//
-+//  File   : Partition_Spliter.cxx
-+//  Author : Benedicte MARTIN
-+//  Module : GEOM
-+//  $Header$
-+
-+//using namespace std;
-+#include "Partition_Inter2d.hxx"
-+#include "Partition_Inter3d.hxx"
-+#include "Partition_Loop2d.hxx"
-+#include "Partition_Loop3d.hxx"
-+#include "Partition_Spliter.ixx"
-+
-+#include "utilities.h"
-+
-+#include <Precision.hxx>
-+#include <TopAbs_Orientation.hxx>
-+#include <TopExp.hxx>
-+#include <TopExp_Explorer.hxx>
-+
-+#include <TopTools_DataMapIteratorOfDataMapOfShapeListOfShape.hxx>
-+#include <TopTools_DataMapOfShapeListOfShape.hxx>
-+#include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
-+#include <TopTools_IndexedMapOfShape.hxx>
-+#include <TopTools_ListIteratorOfListOfShape.hxx>
-+#include <TopTools_ListOfShape.hxx>
-+#include <TopTools_MapIteratorOfMapOfShape.hxx>
-+#include <TopTools_SequenceOfShape.hxx>
-+
-+#include <Geom2d_Curve.hxx>
-+#include <Geom_Curve.hxx>
-+#include <Geom_Surface.hxx>
-+#include <Geom_TrimmedCurve.hxx>
-+#include <gp_Pnt.hxx>
-+#include <gp_Pnt2d.hxx>
-+#include <gp_Vec.hxx>
-+
-+#include <TopoDS.hxx>
-+#include <TopoDS_Compound.hxx>
-+#include <TopoDS_Edge.hxx>
-+#include <TopoDS_Face.hxx>
-+#include <TopoDS_Iterator.hxx>
-+#include <TopoDS_Shell.hxx>
-+#include <TopoDS_Solid.hxx>
-+#include <TopoDS_Vertex.hxx>
-+#include <TopoDS_Wire.hxx>
-+
-+#include <BRepBndLib.hxx>
-+#include <BRepClass3d_SolidClassifier.hxx>
-+#include <BRepLib.hxx>
-+#include <BRep_Tool.hxx>
-+
-+#include <Extrema_ExtPC.hxx>
-+#include <GeomAdaptor_Curve.hxx>
-+#include <TopOpeBRepTool_CurveTool.hxx>
-+
-+#ifdef DEB
-+//# define PART_PERF
-+#endif
-+
-+#ifdef PART_PERF
-+# include <OSD_Chronometer.hxx>
-+#endif
-+
-+//=======================================================================
-+//function : isClosed
-+//purpose  : check id a shape is closed, ie is a solid or a closed shell
-+//=======================================================================
-+
-+static Standard_Boolean isClosed(const TopoDS_Shape& theShape)
-+{
-+  Standard_Boolean isClosed = (theShape.ShapeType() == TopAbs_SOLID);
-+
-+  if (!isClosed && theShape.ShapeType() == TopAbs_SHELL) {
-+    TopTools_IndexedDataMapOfShapeListOfShape MEF;
-+    TopExp::MapShapesAndAncestors(theShape, TopAbs_EDGE, TopAbs_FACE, MEF);
-+    for (Standard_Integer i=1;  isClosed && i<=MEF.Extent();  ++i)
-+      isClosed = ( MEF(i).Extent() != 1 );
-+  }
-+  
-+  return isClosed;
-+}
-+
-+//=======================================================================
-+//function : Partition_Spliter
-+//purpose  : constructor
-+//=======================================================================
-+
-+Partition_Spliter::Partition_Spliter()
-+{
-+  myAsDes = new BRepAlgo_AsDes;
-+  Clear();
-+}
-+
-+//=======================================================================
-+//function : AddTool
-+//purpose  : add cutting tool that will _NOT_ be in result
-+//=======================================================================
-+
-+void Partition_Spliter::AddTool(const TopoDS_Shape& S)
-+{
-+  if (S.ShapeType() < TopAbs_SOLID) { // compound or compsolid
-+    TopoDS_Iterator it (S);
-+    for (; it.More(); it.Next())
-+    {
-+      AddTool( it.Value());
-+      myFaceShapeMap.Bind( it.Value(), S ); // to know compound by shape
-+    }
-+    return;
-+  }
-+
-+  for (TopExp_Explorer exp(S,TopAbs_FACE); exp.More(); exp.Next())
-+  {
-+    myMapTools.Add(exp.Current());
-+    myFaceShapeMap.Bind( exp.Current(), S );
-+  }
-+  if (isClosed( S ))
-+    myClosedShapes.Add( S );
-+}
-+
-+//=======================================================================
-+//function : AddShape
-+//purpose  : add object Shape to be splited
-+//=======================================================================
-+
-+void Partition_Spliter::AddShape(const TopoDS_Shape& S)
-+{
-+  if (S.ShapeType() < TopAbs_SOLID) { // compound or compsolid
-+    TopoDS_Iterator it (S);
-+    for (; it.More(); it.Next())
-+    {
-+      AddShape( it.Value());
-+      myFaceShapeMap.Bind( it.Value(), S ); // to know compound by shape
-+    }
-+    return;
-+  }
-+
-+  TopExp_Explorer exp(S,TopAbs_FACE);
-+  if (!exp.More()) { // do not split edges and vertices
-+    //myBuilder.Add( myShape, S );
-+    return;
-+  }
-+
-+  Standard_Integer nbFacesBefore = myMapFaces.Extent(); // not to add twice the same S
-+  for (; exp.More(); exp.Next()) {
-+    const TopoDS_Shape & aFace = exp.Current();
-+    if ( ! myFaceShapeMap.IsBound( aFace )) // keep shape of tool face added as object
-+      myFaceShapeMap.Bind( aFace, S );
-+    if (myMapFaces.Add( aFace ))
-+      myImagesFaces.SetRoot( aFace );
-+  }
-+
-+  if (nbFacesBefore == myMapFaces.Extent())
-+    return;
-+
-+  // solids must be processed before all
-+  if (S.ShapeType() == TopAbs_SOLID)
-+    myListShapes.Prepend(S);
-+  else
-+    myListShapes.Append(S);
-+
-+  if (isClosed( S ))
-+    myClosedShapes.Add( S );
-+
-+}
-+
-+//=======================================================================
-+//function : Shape
-+//purpose  : return resulting compound
-+//=======================================================================
-+
-+TopoDS_Shape Partition_Spliter::Shape() const
-+{
-+  return myShape;
-+}
-+
-+//=======================================================================
-+//function : Clear
-+//purpose  : clear fields
-+//=======================================================================
-+
-+void Partition_Spliter::Clear()
-+{
-+  myDoneStep = TopAbs_SHAPE;
-+  
-+  myListShapes.Clear();
-+  myMapFaces.Clear();
-+  myMapTools.Clear();
-+  myEqualEdges.Clear();
-+  myNewSection.Clear();
-+  myClosedShapes.Clear();
-+  mySharedFaces.Clear();
-+  myWrappingSolid.Clear();
-+  myFaceShapeMap.Clear();
-+  
-+  myInternalFaces.Clear();
-+  myIntNotClFaces.Clear();
-+  
-+  myAsDes->Clear();
-+  myImagesFaces.Clear();
-+  myImagesEdges.Clear();
-+  myImageShape.Clear();
-+  
-+  //  myInter3d = Partition_Inter3d(myAsDes);
-+  Partition_Inter3d hinter3d (myAsDes);
-+  myInter3d = hinter3d;
-+  
-+  myAddedFacesMap.Clear();
-+
-+}
-+
-+//=======================================================================
-+//function : Compute
-+//purpose  : produce a result
-+//=======================================================================
-+
-+void Partition_Spliter::Compute(const TopAbs_ShapeEnum Limit)
-+{
-+  if ((Limit != TopAbs_SHAPE && myDoneStep == Limit) ||
-+      (Limit == TopAbs_SHAPE && myDoneStep == TopAbs_SOLID))
-+    return;
-+  
-+  myBuilder.MakeCompound( myShape );
-+  
-+  TopTools_MapIteratorOfMapOfShape it;
-+  TopTools_ListIteratorOfListOfShape itl;
-+  TopExp_Explorer exp;
-+
-+#ifdef PART_PERF
-+  OSD_Chronometer aCron;
-+#endif
-+
-+  if (myDoneStep > TopAbs_VERTEX) {
-+
-+    TopTools_ListOfShape aListFaces;
-+    aListFaces = myImagesFaces.Roots();
-+    for (it.Initialize(myMapTools); it.More(); it.Next())
-+      aListFaces.Append(it.Key());
-+
-+#ifdef PART_PERF
-+    aCron.Start();
-+#endif
-+
-+    //-----------------------------------------------
-+    // Intersection between faces
-+    //-----------------------------------------------
-+    // result is in myAsDes as a map Face - list of new edges;
-+    // special care is done for section edges, same domain faces and vertices:
-+    // data about them is inside myInter3d
-+    myInter3d.CompletPart3d(aListFaces, myFaceShapeMap);
-+
-+#ifdef PART_PERF
-+    MESSAGE("+++ CompletPart3d()");
-+    aCron.Show( cout );
-+    aCron.Reset();
-+    aCron.Start();
-+#endif
-+    //-----------------------------------------------
-+    // Intersection of edges
-+    //-----------------------------------------------
-+
-+    // add tool faces which must be reconstructed to myMapFaces too
-+    FindToolsToReconstruct();
-+
-+#ifdef PART_PERF
-+    MESSAGE("+++ FindToolsToReconstruct()");
-+    aCron.Show( cout );
-+    aCron.Reset();
-+    aCron.Start();
-+#endif
-+
-+    // add existing vertices to edges of object faces in myAsDes
-+    TopTools_MapOfShape DoneEM;
-+    for ( it.Initialize(myMapFaces); it.More(); it.Next()) {
-+      const TopoDS_Shape& F  = it.Key();
-+      TopoDS_Face FForward = TopoDS::Face(F.Oriented(TopAbs_FORWARD));
-+      for (exp.Init(FForward,TopAbs_EDGE); exp.More(); exp.Next()) {
-+        const TopoDS_Edge& E = TopoDS::Edge( exp.Current() );
-+        myAsDes->Add(FForward,E);
-+        if (DoneEM.Add(E)) {
-+          TopoDS_Iterator itV(E);
-+          for (; itV.More(); itV.Next()) {
-+            const TopoDS_Vertex& V = TopoDS::Vertex( itV.Value());
-+            myAsDes->Add(E, myInter3d.ReplaceSameDomainV( V, E ));
-+          }
-+        }
-+      }
-+    }
-+
-+    // intersect edges that are descendants of a face in myAsDes
-+    TopTools_MapOfShape& Modif = myInter3d.TouchedFaces();
-+    for ( it.Initialize(Modif); it.More(); it.Next()) {
-+      const TopoDS_Face& F  = TopoDS::Face(it.Key());
-+      Partition_Inter2d::CompletPart2d (myAsDes, F, myInter3d.NewEdges());
-+    }
-+    // now myAsDes contains also new vertices made at edge intersection as
-+    // descendant of edges both new and old
-+
-+    myDoneStep = TopAbs_VERTEX;
-+    
-+#ifdef PART_PERF
-+    MESSAGE("+++ CompletPart2d()");
-+    aCron.Show( cout );
-+    aCron.Reset();
-+    aCron.Start();
-+#endif
-+  } //   if (myDoneStep > TopAbs_VERTEX)
-+  
-+  if (Limit == TopAbs_VERTEX) {
-+    // add new vertices to myShape
-+    for ( it.Initialize( myInter3d.NewEdges() ); it.More(); it.Next()) {
-+      if (! myAsDes->HasDescendant( it.Key() ))
-+        continue;
-+      itl.Initialize( myAsDes->Descendant( it.Key() ));
-+      for (; itl.More(); itl.Next()) 
-+        myBuilder.Add ( myShape, itl.Value() );
-+    }
-+    return;
-+  }
-+  
-+
-+  if (myDoneStep > TopAbs_EDGE) {
-+
-+    //-----------------------------------------------
-+    //-----------------------------------------------
-+    // ------- Reconstruction of all the edges.------
-+    //-----------------------------------------------
-+    //-----------------------------------------------
-+
-+    // ==============
-+    // cut new edges
-+    // ==============
-+    TopTools_ListOfShape LSE; // all edge splits
-+    for ( it.Initialize(myInter3d.NewEdges()); it.More(); it.Next()) {
-+
-+      TopoDS_Vertex V1,V2;
-+      TopoDS_Edge EE = TopoDS::Edge(it.Key());
-+
-+      TopTools_ListOfShape aListV, aListF;
-+      aListV = myAsDes->Descendant(EE); // intersection vertices
-+      aListF = myAsDes->Ascendant(EE);  // intersected faces
-+
-+      if (aListV.IsEmpty())
-+        continue;  // new edge does not intersect any other edge
-+
-+      // Add end vertices to new edges only if 
-+      // one face is Tool and the other is Shape
-+      Standard_Boolean isTool1 = ! myMapFaces.Contains( aListF.First() );
-+      Standard_Boolean isTool2 = ! myMapFaces.Contains( aListF.Last() );
-+      if (isTool1 || isTool2)
-+      {
-+        TopExp::Vertices(EE,V1,V2);
-+      Standard_Real Tol = Max (BRep_Tool::Tolerance( V1 ),
-+                               BRep_Tool::Tolerance( V2 ));
-+
-+        gp_Pnt P1 = BRep_Tool::Pnt(V1);
-+        gp_Pnt P2 = BRep_Tool::Pnt(V2);
-+        Standard_Boolean AddV1 = Standard_True;
-+        Standard_Boolean AddV2 = Standard_True;
-+
-+        // add only if there is no intersection at end vertex
-+        for (itl.Initialize(aListV); itl.More(); itl.Next()) {
-+          const TopoDS_Vertex& Ve = TopoDS::Vertex(itl.Value()) ;
-+          Standard_Real Tol2 = Max ( Tol, BRep_Tool::Tolerance( Ve ));
-+          Tol2 *= Tol2;
-+          gp_Pnt P = BRep_Tool::Pnt(Ve);
-+          if (AddV1 && P.SquareDistance(P1) <= Tol2)
-+            AddV1 = Standard_False;
-+
-+          if (AddV2 && P.SquareDistance(P2) <= Tol2) 
-+            AddV2 = Standard_False;
-+        }
-+
-+        if (AddV1) {
-+          aListV.Append(V1);
-+          myAsDes->Add(EE,V1);
-+        }
-+
-+        if (AddV2) {
-+          aListV.Append(V2);
-+          myAsDes->Add(EE,V2);
-+        }
-+      }
-+
-+      // cut new edges
-+      Standard_Integer NbV=aListV.Extent() ;
-+      if (NbV>1 || (NbV==1 && V1.IsSame(V2)) ) {
-+        TopTools_ListOfShape LNE;
-+        MakeEdges (EE,aListV, LNE);
-+        myImagesEdges.Bind(EE,LNE);
-+      LSE.Append( LNE );
-+      }
-+    }
-+
-+    // ==============
-+    // cut old edges
-+    // ==============
-+    for ( it.Initialize(myMapFaces); it.More(); it.Next()) {
-+      for (exp.Init( it.Key(), TopAbs_EDGE); exp.More(); exp.Next()) {
-+        const TopoDS_Edge& EE = TopoDS::Edge( exp.Current() );
-+        if ( myImagesEdges.HasImage( EE ))
-+          continue;
-+        TopTools_ListOfShape  LNE;
-+        const TopTools_ListOfShape& aListVV = myAsDes->Descendant(EE);
-+        MakeEdges (EE, aListVV, LNE);
-+        myImagesEdges.Bind(EE,LNE);
-+      LSE.Append( LNE );
-+      }
-+    }
-+#ifdef PART_PERF
-+    MESSAGE("+++ Cut Edges");
-+    aCron.Show( cout );
-+    aCron.Reset();
-+    aCron.Start();
-+#endif
-+
-+    // process same domain section edges
-+    MergeEqualEdges( LSE );
-+    
-+    myDoneStep = TopAbs_EDGE;
-+    
-+#ifdef PART_PERF
-+    MESSAGE("+++ MergeEqualEdges()");
-+    aCron.Show( cout );
-+    aCron.Reset();
-+    aCron.Start();
-+#endif
-+  }  //   if (myDoneStep > TopAbs_EDGE) 
-+
-+  if (Limit == TopAbs_EDGE) {
-+    // add splits of old edges
-+    TopTools_ListIteratorOfListOfShape itNE;
-+    for (itl.Initialize( myListShapes );itl.More();itl.Next()) {
-+      if (myMapTools.Contains( itl.Value() ))
-+        continue; // skip tool faces
-+      for ( exp.Init( itl.Value(), TopAbs_EDGE ); exp.More(); exp.Next()) {
-+      itNE.Initialize( myImagesEdges.Image( exp.Current() ));
-+      for ( ; itNE.More(); itNE.Next())
-+        myBuilder.Add ( myShape, itNE.Value() );
-+      }
-+    }
-+    // add splits of new edges
-+    for ( it.Initialize( myInter3d.NewEdges() ); it.More(); it.Next()) {
-+      itNE.Initialize( myImagesEdges.Image( it.Key() ));
-+      for (; itNE.More(); itNE.Next())
-+        myBuilder.Add ( myShape, itNE.Value() );
-+    }
-+    return;
-+  }
-+  
-+  
-+  //-----------------------------------------------
-+  // split faces
-+  //-----------------------------------------------
-+
-+  if (myDoneStep > TopAbs_FACE) {
-+    
-+    for (itl.Initialize(myListShapes);itl.More();itl.Next()) {
-+      TopoDS_Shape FacesComp = MakeFaces ( itl.Value());
-+      // there is a cunning here: myImagesFaces keeps faces made by Loop2d
-+      // but some of them may be replaced with splits of same domain face
-+      // and myImageShape keeps ultimate result
-+      myImageShape.Bind( itl.Value(), FacesComp );
-+    }
-+    
-+    myDoneStep = TopAbs_FACE;
-+#ifdef PART_PERF
-+    MESSAGE("+++ MakeFaces()");
-+    aCron.Show( cout );
-+    aCron.Reset();
-+    aCron.Start();
-+#endif
-+  }
-+  
-+  if (Limit == TopAbs_WIRE ||
-+      Limit == TopAbs_FACE)   {
-+    for (itl.Initialize(myListShapes);itl.More();itl.Next()) {
-+      if ( myMapTools.Contains( itl.Value() ))
-+      continue; // no result needed for a tool face
-+      const TopoDS_Shape& FacesComp = myImageShape.Image( itl.Value() ).First();
-+      for ( exp.Init( FacesComp, Limit); exp.More(); exp.Next())
-+      myBuilder.Add ( myShape, exp.Current());
-+    }
-+    return;
-+  }
-+
-+  
-+  //-----------------------------------------------
-+  // split and add solids and shells
-+  //-----------------------------------------------
-+
-+  Standard_Boolean makeSolids = (Limit == TopAbs_SHAPE ||
-+                               Limit < TopAbs_SHELL);
-+  for (itl.Initialize(myListShapes);itl.More();itl.Next())
-+  {
-+    const TopoDS_Shape & S = itl.Value();
-+    if (S.ShapeType() > TopAbs_SHELL)
-+      continue;
-+
-+    TopTools_ListOfShape NSL; // new shape list
-+    MakeShells (S , NSL);
-+    if (makeSolids && S.ShapeType() == TopAbs_SOLID )
-+      MakeSolids( S, NSL );
-+
-+    // store new shells or solids
-+    TopTools_ListIteratorOfListOfShape itNSL (NSL);
-+    for ( ; itNSL.More(); itNSL.Next()) 
-+      myBuilder.Add (myShape, itNSL.Value());
-+  }
-+#ifdef PART_PERF
-+    MESSAGE("+++ MakeShells()");
-+    aCron.Show( cout );
-+#endif
-+
-+  //-----------------------------------------------
-+  // add split faces
-+  //-----------------------------------------------
-+
-+  for (itl.Initialize(myListShapes);itl.More();itl.Next())
-+  {
-+    const TopoDS_Shape & S = itl.Value();
-+    if (S.ShapeType() != TopAbs_FACE ||
-+        myMapTools.Contains( S ))
-+      continue; 
-+    TopoDS_Iterator itS( myImageShape.Image(S).First() );
-+    for (; itS.More(); itS.Next())
-+      if (! myAddedFacesMap.Contains( itS.Value() ))
-+        myBuilder.Add (myShape, itS.Value());
-+  }
-+
-+  myDoneStep = makeSolids ? TopAbs_SOLID : TopAbs_SHELL;
-+  
-+}
-+
-+//=======================================================================
-+//function : MakeSolids
-+//purpose  : make solids out of Shells
-+//=======================================================================
-+
-+void Partition_Spliter::MakeSolids(const TopoDS_Shape &   theSolid,
-+                                   TopTools_ListOfShape & theShellList)
-+{
-+  // for a solid wrapping other shells or solids without intersection,
-+  // it is necessary to find shells making holes in it
-+
-+  TopTools_ListOfShape aNewSolids; // result
-+  TopTools_ListOfShape aHoleShells;
-+  TopoDS_Shape anInfinitePointShape;
-+
-+  Standard_Boolean isWrapping = myWrappingSolid.Contains( theSolid );
-+  if (!isWrapping && !theShellList.IsEmpty())
-+  {
-+    // check if theSolid initially has internal shells
-+    TopoDS_Iterator aShellExp (theSolid);
-+    aShellExp.Next();
-+    isWrapping = aShellExp.More();
-+  }
-+  
-+  TopTools_ListIteratorOfListOfShape aShellIt(theShellList);
-+  for ( ; aShellIt.More(); aShellIt.Next())
-+  {
-+    const TopoDS_Shape & aShell = aShellIt.Value();
-+
-+    // check if a shell is a hole
-+    if (isWrapping && IsInside (anInfinitePointShape, aShell))
-+      aHoleShells.Append( aShell );
-+    else
-+    {
-+      // make a solid from a shell
-+      TopoDS_Solid Solid;
-+      myBuilder.MakeSolid( Solid );
-+      myBuilder.Add (Solid, aShell);
-+
-+      aNewSolids.Append (Solid);
-+    }
-+  }
-+
-+  // find an outer shell most close to each hole shell
-+  TopTools_DataMapOfShapeShape aInOutMap;
-+  for (aShellIt.Initialize( aHoleShells ); aShellIt.More(); aShellIt.Next())
-+  {
-+    const TopoDS_Shape & aHole = aShellIt.Value();
-+    TopTools_ListIteratorOfListOfShape aSolisIt (aNewSolids);
-+    for ( ; aSolisIt.More(); aSolisIt.Next())
-+    {
-+      const TopoDS_Shape & aSolid = aSolisIt.Value();
-+      if (! IsInside( aHole, aSolid ))
-+        continue;
-+
-+      if ( aInOutMap.IsBound (aHole))
-+      {
-+        const TopoDS_Shape & aSolid2 = aInOutMap( aHole );
-+        if ( IsInside( aSolid, aSolid2 ))
-+        {
-+          aInOutMap.UnBind( aHole );
-+          aInOutMap.Bind ( aHole, aSolid );
-+        }
-+      }
-+      else
-+        aInOutMap.Bind ( aHole, aSolid );
-+    }
-+
-+    // add aHole to a solid
-+    if (aInOutMap.IsBound( aHole ))
-+      myBuilder.Add ( aInOutMap( aHole ), aHole );
-+  }
-+
-+  theShellList.Clear();
-+  theShellList.Append( aNewSolids );
-+}
-+ 
-+//=======================================================================
-+//function : FindFacesInside
-+//purpose  : return compound of faces  of other shapes that are
-+//           inside <theShape>. 
-+//           <theShape> is an object shape.
-+//           <CheckClosed> makes avoid faces that do not form a
-+//           closed shell
-+//           <All> makes return already added faces
-+//=======================================================================
-+
-+TopoDS_Shape Partition_Spliter::FindFacesInside(const TopoDS_Shape& theShape,
-+                                              const Standard_Boolean CheckClosed,
-+                                              const Standard_Boolean All)
-+{
-+  // ================================================
-+  // check if internal faces have been already found
-+  // ================================================
-+  TopExp_Explorer expl;
-+  if (myInternalFaces.IsBound( theShape ))
-+  {
-+    TopoDS_Shape aIntFComp = myInternalFaces.Find ( theShape );
-+    TopoDS_Shape aIntRemFComp = myIntNotClFaces.Find ( theShape );
-+
-+    expl.Init( aIntRemFComp, TopAbs_FACE);
-+    if (CheckClosed || !expl.More())
-+      return aIntFComp;
-+
-+    TopoDS_Compound C;
-+    myBuilder.MakeCompound( C );
-+    // add removed faces
-+    for (; expl.More(); expl.Next())
-+      myBuilder.Add( C, expl.Current() );
-+    // add good internal faces
-+    for (expl.Init( aIntFComp, TopAbs_FACE); expl.More(); expl.Next())
-+      myBuilder.Add( C, expl.Current() );
-+    return C;
-+  }
-+
-+  // ===================================
-+  // get data for internal faces search
-+  // ===================================
-+
-+  // compound of split faces of theShape 
-+  const TopoDS_Shape& CSF = myImageShape.Image(theShape).First();
-+
-+  TopTools_MapOfShape MSE, MFP;
-+  TopTools_DataMapOfShapeListOfShape DMSEFP;
-+  TopTools_MapIteratorOfMapOfShape itm;
-+  TopTools_ListOfShape EmptyL;
-+
-+  // MSE filling: map of new section edges of CSF
-+  for (expl.Init(CSF,TopAbs_EDGE); expl.More(); expl.Next()) {
-+    const TopoDS_Shape & resE = expl.Current() ;
-+    if (myNewSection.Contains( resE )) // only new edges
-+      MSE.Add(resE);
-+  }
-+
-+  // DMEF: map edge of CSF - faces of CSF
-+  TopTools_IndexedDataMapOfShapeListOfShape DMEF;
-+  TopExp::MapShapesAndAncestors(CSF, TopAbs_EDGE, TopAbs_FACE, DMEF);
-+
-+  // Fill
-+  // 1.  MFP - a map of faces to process: map of resulting faces except
-+  // those of theShape; we`ll add to C those of them which are inside CSF
-+  // 2.  DMSEFP - edge of MSE => faces of MFP
-+  TopTools_ListIteratorOfListOfShape itl;
-+  for (itl.Initialize(myListShapes);itl.More();itl.Next()) {
-+    const TopoDS_Shape& aShape = itl.Value();
-+    if ( theShape.IsSame( aShape )) continue;
-+    // fill maps
-+    // iterate on split faces of aShape
-+    TopoDS_Iterator itF ( myImageShape.Image(aShape).First() );
-+    for ( ; itF.More(); itF.Next()) {
-+      const TopoDS_Shape& sf = itF.Value();
-+      MFP.Add(sf);
-+      // iterate on edges of split faces of aShape,
-+      // add to DMSEFP edges that are new
-+      for (expl.Init( sf, TopAbs_EDGE ); expl.More(); expl.Next()) {
-+      TopoDS_Shape se = expl.Current();
-+      if ( MSE.Contains(se)) {// section edge
-+        if (!DMSEFP.IsBound(se)) 
-+          DMSEFP.Bind(se,EmptyL);
-+        DMSEFP(se).Append(sf);
-+      }
-+      }
-+    }
-+  }
-+
-+  // add tool faces having section edges on faces of theShape to MFP and DMSEFP;
-+  // such tool faces need not to be reconstructed and so they are not in myListShapes
-+  for (itm.Initialize(myMapTools); itm.More(); itm.Next())
-+  {
-+    const TopoDS_Shape & aToolFace = itm.Key();
-+    if (myMapFaces.Contains( aToolFace ))
-+      continue;
-+    MFP.Add(aToolFace);
-+    for (expl.Init( aToolFace, TopAbs_EDGE ); expl.More(); expl.Next()) {
-+      TopoDS_Shape se = expl.Current();
-+      if ( MSE.Contains( se )) {// section edge
-+        if (!DMSEFP.IsBound( se )) 
-+          DMSEFP.Bind( se, EmptyL );
-+        DMSEFP( se ).Append( aToolFace );
-+      }
-+    }
-+  }
-+  
-+
-+  // ===========================
-+  // find faces inside theShape
-+  // ===========================
-+
-+  Standard_Boolean skipAlreadyAdded = Standard_False;
-+  Standard_Boolean GoodOri, inside;
-+  Standard_Real dot;
-+  TopTools_ListOfShape KeepFaces;
-+  TopTools_DataMapIteratorOfDataMapOfShapeListOfShape Mapit;
-+
-+  // iterate on section edges, check faces of other shapes
-+  // sharing section edges and put internal faces to KeepFaces
-+  for (Mapit.Initialize(DMSEFP); Mapit.More() ; Mapit.Next() ) {
-+    // a new edge of theShape
-+    const TopoDS_Edge& E = TopoDS::Edge (Mapit.Key());
-+    // an original edge of which E is a split
-+    const TopoDS_Edge& OrigE = TopoDS::Edge ( myImagesEdges.Root( E ));
-+    // does OrigE itself splits a face
-+    Standard_Boolean isSectionE = myInter3d.IsSectionEdge ( OrigE );
-+
-+    // split faces of other shapes sharing E
-+    TopTools_ListOfShape& LSF = DMSEFP.ChangeFind(E);
-+    itl.Initialize( LSF );
-+    while (itl.More()) {
-+      // a split faces of other shape
-+      TopoDS_Face aFace1 = TopoDS::Face(itl.Value());
-+      // remove aFace1 form DMSEFP and MFP
-+      LSF.Remove( itl ); // == itl.Next();
-+      if (!MFP.Remove( aFace1 ))
-+      continue; // was not is MFP ( i.e already checked)
-+      // check if aFace1 was already added to 2 shells
-+      if (!All &&
-+        myAddedFacesMap.Contains( aFace1 ) &&
-+        myAddedFacesMap.Contains( aFace1.Reversed() )) {
-+      skipAlreadyAdded = Standard_True;
-+      continue;
-+      }
-+
-+      // find another face which originates from the same face as aFace1:
-+      // usually aFace2 is internal if aFace1 is not and vice versa
-+
-+      TopoDS_Shape anOrigFace = aFace1;
-+      if (myImagesFaces.IsImage(aFace1))
-+        anOrigFace = myImagesFaces.Root(aFace1);
-+      TopoDS_Shape aFace2;
-+      if ( !isSectionE ) {
-+        while (itl.More()) {
-+          aFace2 = itl.Value();
-+          if (!MFP.Contains( aFace2 )) {
-+            LSF.Remove( itl );
-+            continue;
-+          }
-+          if (anOrigFace.IsSame( myImagesFaces.Root( aFace2 )))
-+            break;
-+          itl.Next();
-+        }
-+        if (itl.More()) { // aFace2 found, remove it from maps
-+          LSF.Remove( itl );
-+          MFP.Remove(aFace2);
-+        }
-+        else
-+          aFace2.Nullify();
-+        itl.Initialize( LSF );
-+      }
-+
-+      // check that anOrigFace is not same domain with CSF faces it intersects
-+
-+      const TopTools_ListOfShape& FL = DMEF.FindFromKey(E); //faces of CSF sharing E
-+      const TopoDS_Shape& origF1 = myImagesFaces.Root(FL.First());
-+      const TopoDS_Shape& origF2 = myImagesFaces.Root(FL.Last());
-+      Standard_Boolean sameDom1 = anOrigFace.IsSame( origF1 );
-+      Standard_Boolean sameDom2 = anOrigFace.IsSame( origF2 );
-+      if (!(sameDom1 || sameDom2) && myInter3d.HasSameDomainF( anOrigFace )) {
-+      sameDom1 = myInter3d.IsSameDomainF( anOrigFace, origF1);
-+        if (origF1 == origF2)
-+          sameDom2 = sameDom1;
-+        else
-+          myInter3d.IsSameDomainF( anOrigFace, origF2);
-+      }
-+      if (sameDom1 && sameDom2)
-+      continue;
-+      if ((sameDom1 || sameDom2)) {
-+      inside = Partition_Loop3d::IsInside (E,
-+                                           TopoDS::Face(FL.First()),
-+                                           TopoDS::Face(FL.Last()),
-+                                           1, dot, GoodOri);
-+      if (inside || (dot + Precision::Angular() >= 1.0))
-+        continue; // E is convex between origF1 and origF2 or they are tangent
-+      }
-+
-+
-+      // keep one of found faces
-+
-+      //face of CSF sharing E
-+      const TopoDS_Shape& aShapeFace = sameDom1 ? FL.Last() : FL.First();
-+      // analyse aFace1 state
-+      inside = Partition_Loop3d::IsInside (E, TopoDS::Face(aShapeFace), aFace1,
-+                                         1, dot, GoodOri);
-+      if (inside && isSectionE)
-+      {
-+        // aFace1 must be tested with both adjacent faces of CSF
-+        const TopoDS_Shape& aShapeFace2 = sameDom1 ? FL.First() : FL.Last();
-+        if (aShapeFace2 != aShapeFace)
-+          inside = Partition_Loop3d::IsInside (E, TopoDS::Face(aShapeFace2), aFace1,
-+                                               1, dot, GoodOri);
-+      }
-+
-+      // store internal face
-+      if (inside)
-+        KeepFaces.Append(aFace1);
-+
-+      else if (!aFace2.IsNull())
-+      {
-+        if (dot + Precision::Angular() >= 1.0)
-+        {
-+          // aFace2 state is not clear, it will be analysed alone,
-+          // put it back to the maps
-+          MFP.Add( aFace2 );
-+          LSF.Append( aFace2 );
-+        }
-+        else
-+          KeepFaces.Append(aFace2);
-+      }
-+    }
-+  }
-+
-+  // ===================================================
-+  // add not distributed faces connected with KeepFaces
-+  // ===================================================
-+
-+  // ultimate list of internal faces
-+  TopTools_ListOfShape KeptFaces;
-+
-+  // add to MFP not split tool faces as well, they may be connected with
-+  // tool faces interfering with theShape
-+  for ( itm.Initialize(myMapTools); itm.More(); itm.Next() ) {
-+    const TopoDS_Shape& aToolFace = itm.Key();
-+    if (!myImageShape.HasImage(aToolFace))
-+      MFP.Add (aToolFace);
-+  }
-+
-+  if (MFP.IsEmpty())
-+    KeptFaces.Append (KeepFaces);
-+
-+  while (!KeepFaces.IsEmpty())
-+  {
-+    // KeepEdges : map of edges of faces kept last time
-+    TopTools_IndexedMapOfShape KeepEdges;
-+    for ( itl.Initialize(KeepFaces); itl.More(); itl.Next() ) {
-+      TopExp::MapShapes( itl.Value(), TopAbs_EDGE, KeepEdges);
-+      KeptFaces.Append( itl.Value() );
-+    }
-+
-+    KeepFaces.Clear();
-+
-+    // keep faces connected with already kept faces by KeepEdges
-+    for ( itm.Initialize(MFP); itm.More(); itm.Next() ) {
-+      const TopoDS_Shape& FP = itm.Key();
-+      for (expl.Init(FP,TopAbs_EDGE); expl.More(); expl.Next()) {
-+        const TopoDS_Shape& se = expl.Current();
-+        if (!MSE.Contains(se) && KeepEdges.Contains(se) ) {
-+          KeepFaces.Append(FP);
-+          MFP.Remove(FP);
-+          break;
-+        }
-+      }
-+    }
-+  }
-+
-+  // ===============================================================
-+  // here MFP contains faces outer of theShape and those of shapes
-+  // which do not interfere with theShape at all and between which
-+  // there may be those wrapped by theShape and whose faces may be
-+  // needed to be returned as well
-+  // ===============================================================
-+
-+  Standard_Boolean isSolid = (theShape.ShapeType() == TopAbs_SOLID);
-+  if (All || isSolid)  // All is for sub-result removal
-+  {
-+    // loop on not used faces; checked faces will be removed from MFP
-+    // during the loop
-+    for ( itm.Initialize( MFP ); itm.More(); itm.Next() ) {
-+      const TopoDS_Shape & aFace = itm.Key();
-+
-+      // a shape which aFace originates from
-+      TopoDS_Shape anOrigShape = GetOriginalShape( aFace );
-+
-+      // find out if all split faces of anOrigShape are not in MFP
-+      // and by the way remove them from MFP
-+      Standard_Boolean isAllOut = Standard_True;
-+      TopoDS_Shape aSplitFaces = anOrigShape;
-+      if (myImageShape.HasImage(anOrigShape))
-+        aSplitFaces = myImageShape.Image(anOrigShape).First();
-+
-+      TopTools_ListOfShape aSplitFaceL; // faces candidate to be kept
-+      for (expl.Init( aSplitFaces, TopAbs_FACE ); expl.More(); expl.Next())
-+      {
-+        const TopoDS_Shape & aSpFace = expl.Current();
-+        // a tool face which became object has image but the whole tool shape has not
-+        if (myImageShape.HasImage( aSpFace ))
-+        {
-+          TopExp_Explorer exF (myImageShape.Image( aSpFace ).First(), TopAbs_FACE );
-+          for ( ; exF.More(); exF.Next() )
-+          {
-+            aSplitFaceL.Append( exF.Current() );
-+            if ( ! MFP.Remove( exF.Current() ) && isAllOut )
-+              // a shared face might be removed from MFP during a prev loop
-+              isAllOut = mySharedFaces.Contains( exF.Current() );
-+          }
-+        }
-+        else
-+        {
-+          aSplitFaceL.Append( aSpFace );
-+          if ( ! MFP.Remove( aSpFace ) && isAllOut)
-+            // a shared face might be removed from MFP during a prev loop
-+            isAllOut = mySharedFaces.Contains( aSpFace );
-+        }
-+      }
-+      itm.Initialize( MFP ); // iterate remaining faces
-+      if ( !isAllOut )
-+        continue;
-+
-+      // classify anOrigShape against theShape
-+      if (IsInside (anOrigShape, theShape))
-+      {
-+        if (isSolid && myClosedShapes.Contains( anOrigShape ))
-+          // to make a special care at solid reconstruction
-+          myWrappingSolid.Add ( theShape );
-+
-+        // keep faces of an internal shape anOrigShape
-+        KeptFaces.Append( aSplitFaceL );
-+      }
-+    }
-+  }
-+
-+  // ====================================================
-+  // check if kept faces form a shell without free edges
-+  // ====================================================
-+
-+  DMEF.Clear();  // edge - kept faces
-+  MFP.Clear(); // reuse it for wrong faces
-+  if (CheckClosed) {
-+    for (itl.Initialize(KeptFaces); itl.More(); itl.Next() ) 
-+      TopExp::MapShapesAndAncestors(itl.Value(), TopAbs_EDGE, TopAbs_FACE, DMEF);
-+
-+    Standard_Integer i, nb = DMEF.Extent();
-+    Standard_Boolean isClosed = Standard_False;
-+    while (!isClosed) {
-+      isClosed = Standard_True;
-+      for (i=1;  isClosed && i<=nb;  ++i) {
-+        const TopoDS_Shape& E = DMEF.FindKey( i );
-+        if (! BRep_Tool::Degenerated( TopoDS::Edge( E )) &&
-+            ! MSE.Contains( E ))
-+          isClosed = ( DMEF(i).Extent() != 1 );
-+      }
-+      if (!isClosed) {
-+        const TopoDS_Shape& F = DMEF.FindFromIndex( i-1 ).First(); // bad face
-+        MFP.Add( F ); 
-+        // remove bad face from DMEF
-+        for (expl.Init( F, TopAbs_EDGE); expl.More(); expl.Next()) {
-+        const TopoDS_Shape& E = expl.Current();
-+          TopTools_ListOfShape& FL = DMEF.ChangeFromKey( E );
-+          for (itl.Initialize( FL ); itl.More(); itl.Next() ) {
-+            if ( F.IsSame( itl.Value() )) {
-+              FL.Remove( itl );
-+              break;
-+            }
-+          }
-+        }
-+      }
-+    }
-+  }
-+
-+  // ==============
-+  // make a result
-+  // ==============
-+
-+  TopoDS_Compound C;
-+  // compound of removed internal faces
-+  TopoDS_Compound CNotCl;
-+
-+  myBuilder.MakeCompound(C);
-+  myBuilder.MakeCompound(CNotCl);
-+
-+  // add to compounds
-+  for (itl.Initialize(KeptFaces); itl.More(); itl.Next() )
-+  {
-+    TopoDS_Shape & aIntFace = itl.Value();
-+    if (! MFP.Contains( aIntFace ))
-+      myBuilder.Add( C, aIntFace);
-+    else
-+      myBuilder.Add( CNotCl, aIntFace);
-+  }
-+
-+  if (!skipAlreadyAdded && CheckClosed)
-+  {
-+    myInternalFaces.Bind( theShape, C );
-+    myIntNotClFaces.Bind( theShape, CNotCl );
-+  }
-+
-+  return C;
-+}
-+
-+//=======================================================================
-+//function : MakeShell
-+//purpose  : split S into compound of shells
-+//=======================================================================
-+
-+void Partition_Spliter::MakeShells(const TopoDS_Shape& S,
-+                                   TopTools_ListOfShape& NS)
-+{
-+  Partition_Loop3d ShellMaker;
-+  // get compound of split faces of S
-+  const TopoDS_Shape& FacesComp = myImageShape.Image(S).First();
-+  ShellMaker.AddConstFaces( FacesComp );
-+  // add split faces inside S
-+  if (myClosedShapes.Contains( S )) {
-+    TopoDS_Shape InternalFacesComp = FindFacesInside(S, Standard_True);
-+    ShellMaker.AddSectionFaces( InternalFacesComp );
-+  }
-+  
-+  NS = ShellMaker.MakeShells( myAddedFacesMap );
-+
-+  // Add faces added to new shell to myAddedFacesMap:
-+  // avoid rebuilding twice commont part of 2 solids.
-+  TopTools_ListIteratorOfListOfShape itS(NS);
-+  while ( itS.More()) {
-+    TopExp_Explorer expF (itS.Value(), TopAbs_FACE);
-+    for (; expF.More(); expF.Next())
-+      myAddedFacesMap.Add (expF.Current());
-+    
-+    itS.Next();
-+  }
-+}
-+
-+//=======================================================================
-+//function : findEqual
-+//purpose  : compare edges of EL1 against edges of EL2,
-+//           Result is in EMM binding EL1 edges to list of equal edges.
-+//           Edges are considered equall only if they have same vertices.
-+//           <addSame>==True makes consider same edges as equal
-+//           Put in <AllEqMap> all equal edges
-+//=======================================================================
-+
-+static void findEqual (const TopTools_ListOfShape& EL1,
-+                     const TopTools_ListOfShape& EL2,
-+                     const Standard_Boolean addSame,
-+                     TopTools_DataMapOfShapeListOfShape& EEM,
-+                     TopTools_MapOfShape& AllEqMap)
-+{
-+  // map vertices to edges for EL2
-+  TopTools_DataMapOfShapeListOfShape VEM;
-+  TopTools_ListIteratorOfListOfShape itE1, itE2(EL2);
-+  TopoDS_Iterator itV;
-+  TopTools_ListOfShape emptyL;
-+  for (; itE2.More(); itE2.Next()) {
-+    for (itV.Initialize( itE2.Value() ); itV.More(); itV.Next()) {
-+      const TopoDS_Shape& V = itV.Value(); 
-+      if (! VEM.IsBound( V ) )
-+      VEM.Bind( V, emptyL);
-+      VEM( V ).Append( itE2.Value());
-+    }
-+  }
-+
-+  gp_Vec D1, D2;
-+  gp_Pnt P;
-+  Standard_Real f,l,u,tol;
-+  Handle(Geom_Curve) C1, C2;
-+  Extrema_ExtPC Extrema;
-+  TopoDS_Vertex V1, V2, V3, V4;
-+
-+  AllEqMap.Clear();
-+  
-+  for (itE1.Initialize(EL1); itE1.More(); itE1.Next()) {
-+    const TopoDS_Edge& E1 = TopoDS::Edge( itE1.Value());
-+    if (BRep_Tool::Degenerated( E1 ) || AllEqMap.Contains (E1))
-+      continue;
-+    TopExp::Vertices( E1, V1, V2 );
-+
-+    if (VEM.IsBound(V1))
-+      itE2.Initialize( VEM(V1) );
-+    for (; itE2.More(); itE2.Next()) {
-+      const TopoDS_Edge& E2 = TopoDS::Edge( itE2.Value());
-+      if (BRep_Tool::Degenerated( E2 ) || AllEqMap.Contains (E2))
-+        continue;
-+
-+      if (E1.IsSame(E2)) {
-+      if (!addSame)
-+        continue;
-+      }
-+      else {
-+      TopExp::Vertices( E2, V3, V4);
-+      if (!V2.IsSame(V4) && !V2.IsSame(V3))
-+        continue;
-+      // E1 and E2 have same vertices
-+      // check D1 at end points.
-+        C2 = BRep_Tool::Curve( E2, f,l);
-+        C1 = BRep_Tool::Curve( E1, f,l);
-+      u = BRep_Tool::Parameter(V1,E1);
-+        C1->D1(u, P, D1);
-+      u = BRep_Tool::Parameter(V1.IsSame(V3) ? V3 : V4, E2);
-+      C2->D1(u, P, D2);
-+        D1.Normalize(); D2.Normalize();
-+        if (Abs(D1*D2) + Precision::Angular() < 1.0)
-+          continue;
-+      if (! V1.IsSame(V2)) {
-+        u = BRep_Tool::Parameter(V2,E1);
-+        C1->D1(u, P, D1);
-+        u = BRep_Tool::Parameter(V2.IsSame(V3) ? V3 : V4, E2);
-+        C2->D1(u, P, D2);
-+        D1.Normalize(); D2.Normalize();
-+        if (Abs(D1*D2) + Precision::Angular() < 1.0)
-+          continue;
-+      }
-+        // check distance at a couple of internal points
-+        tol = Max(BRep_Tool::Tolerance(E1),
-+                  BRep_Tool::Tolerance(E2));
-+        GeomAdaptor_Curve AC1(C1);
-+        Extrema.Initialize(AC1,f,l);
-+      Standard_Boolean ok = Standard_True, hasMin = Standard_False;
-+      BRep_Tool::Range( E2, f, l);
-+        Standard_Integer i=1, nbi=3;
-+        for (; i<nbi && ok; ++i) {
-+          Extrema.Perform( C2->Value( f+(l-f)*i/nbi ));
-+          Standard_Integer j=1, nbj=Extrema.NbExt();
-+          for (; j<=nbj && ok; ++j) {
-+            if (Extrema.IsMin(j)) {
-+            hasMin = Standard_True;
-+              ok = Extrema.Value(j) <= tol;
-+          }
-+          }
-+        }
-+        if ( !hasMin || !ok)
-+          continue;
-+      }
-+      // bind E2 to E1 in EEM
-+      if (!EEM.IsBound(E1)) {
-+        EEM.Bind (E1, emptyL);
-+      AllEqMap.Add (E1);
-+      }
-+      EEM(E1).Append(E2);
-+      AllEqMap.Add (E2);
-+    }
-+  }
-+}
-+
-+//=======================================================================
-+//function : MakeFaces
-+//purpose  : split faces of S, return compound of new faces
-+//=======================================================================
-+
-+TopoDS_Shape Partition_Spliter::MakeFaces (const TopoDS_Shape& S)
-+{
-+  TopoDS_Compound C;
-+  myBuilder.MakeCompound(C);
-+  
-+  TopTools_ListIteratorOfListOfShape itl, itNE;
-+  
-+  TopExp_Explorer exp(S,TopAbs_FACE);
-+  for (; exp.More(); exp.Next()) {
-+
-+    const TopoDS_Face& F = TopoDS::Face(exp.Current());
-+
-+    TopTools_ListOfShape LNF;
-+    
-+    if (myImagesFaces.HasImage( F )) {
-+      myImagesFaces.LastImage( F, LNF );
-+      TopAbs_Orientation oriF = F.Orientation();
-+      for ( itl.Initialize( LNF ); itl.More(); itl.Next())
-+      itl.Value().Orientation( oriF );
-+    }
-+    else {
-+
-+      Partition_Loop2d loops;
-+      loops.Init(F);
-+
-+      TopTools_IndexedMapOfShape EM;
-+      TopExp::MapShapes( F, TopAbs_EDGE, EM);
-+
-+      TopTools_MapOfShape AddedEqualM, EqualSeamM;
-+      Standard_Boolean needRebuild = Standard_False;
-+
-+      // add splits to loops
-+
-+      // LE: old edges + new not splitted edges
-+      const TopTools_ListOfShape& LE = myAsDes->Descendant(F);
-+      for (itl.Initialize(LE); itl.More(); itl.Next()) {
-+      const TopoDS_Edge& E = TopoDS::Edge( itl.Value() );
-+
-+      Standard_Boolean isSectionE = myInter3d.IsSectionEdge(E);
-+      Standard_Boolean isNewE = !EM.Contains( E );
-+
-+      // LSE: list of split edges
-+      TopTools_ListOfShape LSE;
-+      myImagesEdges.LastImage(E,LSE); // splits of E or E itself
-+
-+      for (itNE.Initialize(LSE); itNE.More(); itNE.Next()) {
-+
-+        TopoDS_Edge NE = TopoDS::Edge( itNE.Value() );
-+        Standard_Boolean isSameE = NE.IsSame ( E );
-+        
-+        if ( isNewE || isSectionE || !isSameE) {
-+          if (AddedEqualM.Contains( NE )) {
-+              // a seam must be twice in a loop
-+              if (!BRep_Tool::IsClosed( E, F ) || !EqualSeamM.Add( NE ))
-+                continue;
-+            }
-+
-+          if (isNewE) {
-+            if (isSectionE) {
-+              if ( ! myInter3d.IsSplitOn( NE, E, F) )
-+                continue;
-+            }
-+            else {
-+              TopoDS_Vertex V1,V2;
-+              TopExp::Vertices(NE,V1,V2);
-+              const TopTools_ListOfShape& EL1 = myAsDes->Ascendant(V1);
-+              const TopTools_ListOfShape& EL2 = myAsDes->Ascendant(V2);
-+              if ( EL1.Extent() < 2 && EL2.Extent() < 2 )
-+                continue;
-+            }
-+          }
-+          else {
-+            NE.Orientation( E.Orientation());
-+            if (!isSameE) {
-+              // orient NE because it may be a split of other edge
-+              Standard_Real f,l,u;
-+              Handle(Geom_Curve) C3d  = BRep_Tool::Curve( E,f,l );
-+              Handle(Geom_Curve) NC3d = BRep_Tool::Curve( NE,f,l);
-+              if ( C3d != NC3d) {
-+                gp_Vec D1, ND1;  gp_Pnt P;
-+                TopoDS_Vertex V = TopExp::FirstVertex(NE);
-+                u = BRep_Tool::Parameter(V,NE);
-+                NC3d->D1 (u, P, ND1);
-+                u = BRep_Tool::Parameter(V,E);
-+                C3d ->D1 (u, P, D1);
-+                if (ND1.Dot(D1) < 0)
-+                  NE.Reverse();
-+              }
-+            }
-+          }
-+          if (myEqualEdges.Contains( NE ))
-+              AddedEqualM.Add( NE );
-+
-+          needRebuild = Standard_True;
-+        }
-+
-+        if (isNewE || isSectionE)
-+          myNewSection.Add( NE );
-+
-+        if (isNewE) 
-+          loops.AddSectionEdge(NE);
-+        else
-+          loops.AddConstEdge(NE);
-+      }
-+      }
-+
-+      //-------------------
-+      // Build the faces.
-+      //-------------------
-+      
-+      if (needRebuild) {
-+      
-+        loops.Perform();
-+        loops.WiresToFaces(myImagesEdges);
-+
-+        LNF = loops.NewFaces();
-+
-+        myImagesFaces.Bind(F,LNF);
-+
-+        // replace the result faces that have already been built
-+        // during same domain faces reconstruction done earlier
-+        if (myInter3d.HasSameDomainF( F ))
-+        {
-+          // build map edge to same domain faces: EFM
-+          TopTools_IndexedDataMapOfShapeListOfShape EFM;
-+          TopTools_MapOfShape SDFM; // avoid doubling
-+          itl.Initialize( myInter3d.SameDomain( F ));
-+          for (; itl.More(); itl.Next()) {
-+            if ( !myImagesFaces.HasImage( itl.Value() ))
-+              continue;
-+            // loop on splits of a SD face
-+            TopTools_ListIteratorOfListOfShape itNF;
-+            itNF.Initialize (myImagesFaces.Image( itl.Value() ));
-+            for ( ; itNF.More(); itNF.Next()) {
-+              TopoDS_Shape SDF = itNF.Value();
-+              if (myImagesFaces.HasImage( SDF )) // already replaced
-+                SDF = myImagesFaces.Image( SDF ).First();
-+              if (SDFM.Add (SDF))
-+                TopExp::MapShapesAndAncestors(SDF, TopAbs_EDGE, TopAbs_FACE, EFM);
-+            }
-+          }
-+          // do replace faces in the LNF
-+          TopTools_ListOfShape LOF;
-+          if ( !EFM.IsEmpty() )
-+            itl.Initialize( LNF );
-+          while (itl.More()) {
-+            const TopoDS_Shape& NF = itl.Value();
-+            TopExp_Explorer expE ( NF, TopAbs_EDGE );
-+            const TopoDS_Edge& E  = TopoDS::Edge (expE.Current());
-+            if (EFM.Contains( E )) {
-+              const TopTools_ListOfShape& SDFL = EFM.FindFromKey( E );
-+              TopoDS_Shape SDF = SDFL.First();
-+              Standard_Boolean GoodOri;
-+              Standard_Real dot;
-+              Partition_Loop3d::IsInside (E, TopoDS::Face(NF), TopoDS::Face(SDF),
-+                                          1, dot, GoodOri);
-+              if (dot < 0)
-+              {
-+                // NF and SDF are on different side of E
-+                if (SDFL.Extent() == 1) {
-+                  itl.Next();
-+                  continue;
-+                }
-+                else
-+                  SDF = SDFL.Last(); // next face must be on the same side
-+              }
-+              gp_Vec V1 = Partition_Loop3d::Normal( E, TopoDS::Face( NF ));
-+              gp_Vec V2 = Partition_Loop3d::Normal( E, TopoDS::Face( SDF ));
-+              if (V1*V2 < 0)
-+                SDF.Reverse();
-+
-+              if (!myImagesFaces.HasImage( NF ))
-+                myImagesFaces.Bind( NF, SDF );
-+
-+              // mySharedFaces is used in FindFacesInside()
-+              mySharedFaces.Add( SDF );
-+
-+              LOF.Prepend ( SDF );
-+              LNF.Remove (itl);
-+            }
-+            else
-+              itl.Next();
-+          }
-+
-+          LNF.Append (LOF);
-+        }
-+      } // if (needRebuild)
-+      
-+      else {
-+      LNF.Append( F );
-+      myImagesFaces.Bind(F,LNF);
-+      }
-+    } // if (myImagesFaces.HasImage( F ))
-+
-+    // fill the resulting compound
-+    for (itl.Initialize(LNF); itl.More(); itl.Next())
-+      myBuilder.Add ( C, itl.Value());
-+    
-+  } // loop on faces of S
-+
-+  return C;
-+}
-+
-+
-+//=======================================================================
-+//function : Tri
-+//purpose  : 
-+//=======================================================================
-+
-+static void Tri(const TopoDS_Edge&        E,
-+              TopTools_SequenceOfShape& Seq,
-+                const Partition_Inter3d & theInter3d)
-+{
-+  Standard_Boolean Invert   = Standard_True;
-+  Standard_Real    U1,U2;
-+  TopoDS_Vertex    V1,V2;
-+
-+  while (Invert) {
-+    Invert = Standard_False;
-+    for ( Standard_Integer i = 1; i < Seq.Length(); i++) {
-+      
-+      V1 = TopoDS::Vertex(Seq.Value(i));
-+      V2 = TopoDS::Vertex(Seq.Value(i+1));
-+      
-+      V1.Orientation(TopAbs_INTERNAL);
-+      V2.Orientation(TopAbs_INTERNAL);
-+      
-+      U1 = BRep_Tool::Parameter(V1,E);
-+      U2 = BRep_Tool::Parameter(V2,E);
-+      
-+      if (IsEqual(U1,U2)) {
-+        if (theInter3d.ReplaceSameDomainV( V1, E ).IsSame( V1 ))
-+          Seq.Remove(i+1); // remove V2
-+        else
-+          Seq.Remove(i);
-+      i--;
-+      continue;
-+      }
-+      if (U2 < U1) {
-+      Seq.Exchange(i,i+1);
-+      Invert = Standard_True;
-+      }
-+    }
-+  }
-+}
-+
-+//=======================================================================
-+//function : MakeEdges
-+//purpose  : cut E by vertices VOnE, return list of new edges NE
-+//=======================================================================
-+
-+void Partition_Spliter::MakeEdges (const TopoDS_Edge& E,
-+                                   const TopTools_ListOfShape& VOnE,
-+                                   TopTools_ListOfShape& NE   ) const
-+{
-+  TopoDS_Edge WE = E;
-+  WE.Orientation(TopAbs_FORWARD);
-+
-+  Standard_Real    U1,U2, f, l;
-+  TopoDS_Vertex    V1,V2,VF,VL;
-+
-+  BRep_Tool::Range(WE,f,l);
-+  TopExp::Vertices(WE,VF,VL);
-+
-+  if (VOnE.Extent() < 3) { // do not rebuild not cut edge
-+    if (( VF.IsSame( VOnE.First() ) && VL.IsSame( VOnE.Last() )) ||
-+      VL.IsSame( VOnE.First() ) && VF.IsSame( VOnE.Last() )  ) {
-+      NE.Append( E );
-+      return;
-+    }
-+  }
-+
-+  TopTools_SequenceOfShape SV;
-+  TopTools_ListIteratorOfListOfShape itv(VOnE);
-+  TopTools_MapOfOrientedShape VM( VOnE.Extent() );
-+  for (; itv.More(); itv.Next())
-+    if ( VM.Add( itv.Value() ))
-+      SV.Append(itv.Value());
-+
-+  Tri( WE, SV, myInter3d );
-+
-+  if (SV.Length() < 3) { // do not rebuild not cut edge
-+    if (( VF.IsSame( SV.First() ) && VL.IsSame( SV.Last() )) ||
-+      VL.IsSame( SV.First() ) && VF.IsSame( SV.Last() )  ) {
-+      NE.Append( E );
-+      return;
-+    }
-+  }
-+
-+  Standard_Integer iVer, NbVer = SV.Length();
-+
-+
-+  //----------------------------------------------------------------
-+  // Construction of the new edges .
-+  //----------------------------------------------------------------
-+
-+  if (VF.IsSame(VL)) { // closed edge
-+    if (NbVer==1) 
-+      SV.Append( SV.First() );
-+    else if (!SV.First().IsSame(SV.Last())) {
-+      Standard_Boolean isFirst=0;
-+      Standard_Real    minDU = 1.e10;
-+      TopoDS_Vertex endV = Partition_Inter2d::FindEndVertex(VOnE, f,l, E, isFirst,minDU);
-+      if (endV.IsSame(SV.First()))
-+      SV.Append(endV);
-+      else if (endV.IsSame(SV.Last()))
-+      SV.Prepend(endV);
-+      else
-+      MESSAGE ("END VERTEX IS IN SEQUNCE MIDDLE");
-+    }
-+    NbVer = SV.Length();
-+  }
-+
-+  for (iVer=1; iVer < NbVer; iVer++) {
-+    V1  = TopoDS::Vertex(SV(iVer));
-+    V2  = TopoDS::Vertex(SV(iVer+1));
-+    
-+    TopoDS_Shape NewEdge = WE.EmptyCopied();
-+    V1.Orientation(TopAbs_FORWARD);
-+    myBuilder.Add  (NewEdge,V1);
-+    V2.Orientation(TopAbs_REVERSED);
-+    myBuilder.Add  (NewEdge,V2);
-+    
-+    if (iVer==1)
-+      U1 = f;
-+    else      {
-+      V1.Orientation(TopAbs_INTERNAL);
-+      U1=BRep_Tool::Parameter(V1,WE);
-+    }
-+    if (iVer+1 == NbVer)
-+      U2 = l;
-+    else      {
-+      V2.Orientation(TopAbs_INTERNAL);
-+      U2=BRep_Tool::Parameter(V2,WE);
-+    }
-+    if (Abs(U1-U2) <= Precision::PConfusion()) {
-+      MESSAGE( "MakeEdges(), EQUAL PARAMETERS OF DIFFERENT VERTICES");
-+      continue;
-+    }
-+    TopoDS_Edge EE=TopoDS::Edge(NewEdge);
-+    myBuilder.Range (EE,U1,U2);
-+
-+    TopoDS_Edge NEdge = TopoDS::Edge(NewEdge);
-+    myBuilder.SameParameter(NEdge,Standard_False);
-+
-+    Standard_Real tol = 1.0e-2;
-+    Standard_Boolean flag = BRep_Tool::SameParameter(NEdge);
-+    if (!flag) {
-+      BRepLib::SameParameter(NEdge,tol);
-+    }
-+    NE.Append(NEdge.Oriented(E.Orientation()));
-+  }
-+}
-+
-+//=======================================================================
-+//function : MergeEqualEdges
-+//purpose  : find equal edges,  choose  ones  to  keep and make
-+//           them have pcurves on all faces they are shared by
-+//=======================================================================
-+
-+void Partition_Spliter::MergeEqualEdges (const TopTools_ListOfShape& LSE)
-+{
-+  // find equal edges
-+  // map: edge - equal edges
-+  TopTools_DataMapOfShapeListOfShape EEM( LSE.Extent() );
-+  findEqual (LSE, LSE, 0, EEM, myEqualEdges);
-+
-+  TopTools_ListOfShape EEL; // list of equal edges
-+  TopTools_DataMapIteratorOfDataMapOfShapeListOfShape itM (EEM);
-+  for ( ; itM.More(); itM.Next()) {
-+    EEL = itM.Value();
-+    EEL.Append( itM.Key() );
-+
-+    // choose an edge to keep, section edges have priority
-+    TopoDS_Edge EKeep;
-+    TopTools_ListIteratorOfListOfShape itEE (EEL);
-+    for (; itEE.More(); itEE.Next()) {
-+      EKeep = TopoDS::Edge( itEE.Value() );
-+      const TopoDS_Edge& EKeepOrig = TopoDS::Edge( myImagesEdges.Root( EKeep ));
-+      if (myInter3d.IsSectionEdge( EKeepOrig ))
-+        break;
-+    }
-+
-+    // update edge images and build pcurves
-+    Standard_Real f,l, tol;
-+    for (itEE.Initialize (EEL); itEE.More(); itEE.Next()) {
-+      const TopoDS_Edge& E = TopoDS::Edge( itEE.Value() );
-+      if ( E.IsSame( EKeep )) 
-+        continue;
-+
-+      // 1. build pcurves of the kept edge on faces where replaced edges exist
-+      const TopoDS_Edge& EReplOrig = TopoDS::Edge( myImagesEdges.Root( E ));
-+      TopTools_ListOfShape FL;
-+      FL = myAsDes->Ascendant( EReplOrig );
-+      Standard_Integer iFace, iFirstSectionFace = FL.Extent() + 1;
-+      // add faces where the replaced edge is a section edge
-+      if (myInter3d.IsSectionEdge( EReplOrig )) {
-+        TopTools_ListIteratorOfListOfShape seIt;
-+        seIt.Initialize( myInter3d.SectionEdgeFaces ( EReplOrig ));
-+        for ( ; seIt.More(); seIt.Next())
-+          FL.Append( seIt.Value() );
-+      }
-+      // loop on faces
-+      TopTools_ListIteratorOfListOfShape itF (FL);
-+      for ( iFace = 1 ; itF.More(); itF.Next(), ++iFace ) {
-+        const TopoDS_Face& F = TopoDS::Face( itF.Value());
-+
-+        Handle(Geom2d_Curve) pc = BRep_Tool::CurveOnSurface( EKeep, F, f,l);
-+        if (pc.IsNull()) {
-+          Handle(Geom_Curve) C3d = BRep_Tool::Curve( EKeep, f, l);
-+          C3d = new Geom_TrimmedCurve( C3d, f,l);
-+          pc = TopOpeBRepTool_CurveTool::MakePCurveOnFace (F,C3d,tol);
-+          if (pc.IsNull()) {
-+            MESSAGE (" CANT BUILD PCURVE ");
-+          }
-+          myBuilder.UpdateEdge( EKeep, pc, F, tol);
-+        }
-+
-+        if (iFace >= iFirstSectionFace ||
-+            !BRep_Tool::IsClosed( EReplOrig, F ))
-+          continue;
-+
-+        // build the second pcurve for a seam
-+        TopoDS_Vertex V = TopExp::FirstVertex( EKeep );
-+        Standard_Real Ukeep = BRep_Tool::Parameter( V, EKeep );
-+        Standard_Real Urepl = BRep_Tool::Parameter( V, E );
-+
-+        TopoDS_Edge EReplRev = E;
-+        EReplRev.Reverse();
-+        Handle(Geom2d_Curve) pcRepl1 = BRep_Tool::CurveOnSurface( E, F, f,l);
-+        Handle(Geom2d_Curve) pcRepl2 = BRep_Tool::CurveOnSurface( EReplRev, F, f,l);
-+
-+        gp_Pnt2d p1r, p2r, pk;
-+        p1r = pcRepl1->Value( Urepl );
-+        p2r = pcRepl2->Value( Urepl );
-+        pk  = pc->Value( Ukeep );
-+
-+        // suppose that pk is equal to either p1r or p2r
-+        Standard_Boolean isUPeriod =
-+          ( Abs( p1r.X() - p2r.X() ) > Abs( p1r.Y() - p2r.Y() ));
-+        Standard_Boolean is1Equal;
-+        if (isUPeriod)
-+          is1Equal = ( Abs( p1r.X() - pk.X() ) < Abs( p2r.X() - pk.X() ));
-+        else
-+          is1Equal = ( Abs( p1r.Y() - pk.Y() ) < Abs( p2r.Y() - pk.Y() ));
-+
-+        Handle(Geom2d_Curve) pc2 = Handle(Geom2d_Curve)::DownCast
-+          ( pc->Translated( pk, is1Equal ? p2r : p1r ) );
-+
-+        if (E.Orientation() == TopAbs_REVERSED)
-+          is1Equal = !is1Equal;
-+
-+        if (is1Equal)
-+          myBuilder.UpdateEdge( EKeep, pc, pc2, F, tol);
-+        else
-+          myBuilder.UpdateEdge( EKeep, pc2, pc, F, tol);
-+
-+      } // loop on a Faces where a replaced edge exists
-+
-+
-+      // 2. update edge images according to replacement
-+      if (myImagesEdges.HasImage( E ))
-+        myImagesEdges.Remove( E );
-+      myImagesEdges.Bind( E, EKeep );
-+
-+    } // loop on a list of equal edges EEL
-+  } // loop on a map of equal edges EEM
-+}
-+
-+//=======================================================================
-+//function : KeepShapesInside
-+//purpose  : remove shapes that are outside of S from resul
-+//=======================================================================
-+
-+void Partition_Spliter::KeepShapesInside (const TopoDS_Shape& S)
-+{
-+  TopoDS_Iterator it;
-+  if (S.ShapeType() < TopAbs_SOLID) { // compound or compsolid
-+    for (it.Initialize( S ); it.More(); it.Next())
-+      KeepShapesInside( it.Value());
-+    return;
-+  }
-+
-+  Standard_Boolean isTool = Standard_False;
-+  if (!myImageShape.HasImage( S )) {
-+    isTool = CheckTool( S );
-+    if (!isTool) return;
-+  }
-+
-+  // build map of internal faces
-+  TopTools_IndexedMapOfShape MIF;
-+  TopoDS_Shape IntFacesComp = FindFacesInside( S, Standard_False, Standard_True);
-+  TopExp::MapShapes( IntFacesComp, TopAbs_FACE, MIF );
-+
-+  TopoDS_Compound C;
-+  myBuilder.MakeCompound(C);
-+
-+  TopAbs_ShapeEnum anInternalShapeType = TopAbs_SHAPE;
-+  if (!MIF.IsEmpty())
-+  {
-+    // leave in the result only those shapes having a face in MIF
-+    for (it.Initialize( myShape ); it.More(); it.Next()) {
-+      const TopoDS_Shape & aResShape = it.Value();
-+      TopExp_Explorer expResF( aResShape, TopAbs_FACE );
-+      for (; expResF.More(); expResF.Next()) {
-+        if ( MIF.Contains( expResF.Current())) {
-+          myBuilder.Add( C, aResShape );
-+          if (aResShape.ShapeType() < anInternalShapeType)
-+            anInternalShapeType = aResShape.ShapeType();
-+          break;
-+        }
-+      }
-+    }
-+  }
-+
-+  // may be S was not split by internal faces then it is missing
-+  // in myShape, add it
-+  if (!isTool &&
-+      (anInternalShapeType > TopAbs_SOLID || S.ShapeType() > TopAbs_SOLID))
-+  {
-+    TopTools_IndexedMapOfShape MSF; // map of split faces of S
-+    TopExp::MapShapes( myImageShape.Image(S).First(), TopAbs_FACE, MSF);
-+
-+    // find a shape having all faces in MSF
-+    for (it.Initialize( myShape ); it.More(); it.Next()) {
-+      TopExp_Explorer expResF( it.Value(), TopAbs_FACE );
-+      for (; expResF.More(); expResF.Next()) {
-+        if (! MSF.Contains( expResF.Current())) 
-+          break;
-+      }
-+      if (! expResF.More()) {
-+        myBuilder.Add( C, it.Value() );
-+        break;
-+      }
-+    }
-+  }
-+
-+  myShape = C;
-+}
-+
-+//=======================================================================
-+//function : RemoveShapesInside
-+//purpose  : remove shapes that are inside S from resul
-+//=======================================================================
-+
-+void Partition_Spliter::RemoveShapesInside (const TopoDS_Shape& S)
-+{
-+  TopoDS_Iterator it;
-+  if (S.ShapeType() < TopAbs_SOLID) { // compound or compsolid
-+    for (it.Initialize( S ); it.More(); it.Next())
-+      RemoveShapesInside( it.Value());
-+    return;
-+  }
-+  Standard_Boolean isTool = Standard_False;
-+  if (!myImageShape.HasImage( S )) {
-+    isTool = CheckTool( S );
-+    if (!isTool) return;
-+  }
-+
-+  TopoDS_Shape IntFacesComp = FindFacesInside( S, Standard_False, Standard_True);
-+  TopTools_IndexedMapOfShape MIF; // map of internal faces
-+  TopExp::MapShapes( IntFacesComp, TopAbs_FACE, MIF);
-+
-+  if (MIF.IsEmpty()) return;
-+
-+  // add to MIF split faces of S
-+  if (myImageShape.HasImage(S))
-+    TopExp::MapShapes( myImageShape.Image(S).First(), TopAbs_FACE, MIF);
-+
-+  // leave in the result only those shapes not having all face in MIF
-+  
-+  TopoDS_Compound C;
-+  myBuilder.MakeCompound(C);
-+
-+  // RMF : faces of removed shapes that encounter once
-+  TopTools_MapOfShape RFM;
-+  
-+  for (it.Initialize( myShape ); it.More(); it.Next()) {
-+    
-+    TopExp_Explorer expResF( it.Value(), TopAbs_FACE );
-+    for (; expResF.More(); expResF.Next())
-+      if (!MIF.Contains( expResF.Current()))
-+      break;
-+
-+    if (expResF.More())
-+      // add shape to result
-+      myBuilder.Add( C, it.Value() );
-+    else 
-+      // add faces of a removed shape to RFM
-+      for (expResF.ReInit(); expResF.More(); expResF.Next()) {
-+      const TopoDS_Shape& F = expResF.Current();
-+      if ( ! RFM.Remove ( F ))
-+        RFM.Add( F );
-+      }
-+  }
-+
-+  if (!isTool) {
-+
-+    // rebuild S, it must remain in the result
-+
-+    Standard_Boolean isClosed = Standard_False;
-+    switch (S.ShapeType()) {
-+    case TopAbs_SOLID :
-+      isClosed = Standard_True; break;
-+    case TopAbs_SHELL: {
-+      TopTools_IndexedDataMapOfShapeListOfShape MEF;
-+      TopExp::MapShapesAndAncestors(S, TopAbs_EDGE, TopAbs_FACE, MEF);
-+      Standard_Integer i;
-+      for (i=1;  isClosed && i<=MEF.Extent();  ++i) 
-+        isClosed = ( MEF(i).Extent() != 1 );
-+      break;
-+    }
-+    default:
-+      isClosed = Standard_False;
-+    }
-+    if (isClosed) {
-+
-+      // add to a new shape external faces of removed shapes, ie those in RFM
-+
-+      TopoDS_Shell Shell;
-+      myBuilder.MakeShell( Shell );
-+
-+      // exclude redundant internal face with edges encounterd only once
-+      TopTools_IndexedDataMapOfShapeListOfShape MEF;
-+      TopTools_MapIteratorOfMapOfShape itF (RFM);
-+      for ( ; itF.More(); itF.Next()) 
-+        TopExp::MapShapesAndAncestors(itF.Key(), TopAbs_EDGE, TopAbs_FACE, MEF);
-+
-+      // add only faces forming a closed shell
-+      for (itF.Reset() ; itF.More(); itF.Next())
-+      {
-+        TopExp_Explorer expE (itF.Key(), TopAbs_EDGE);
-+        for (; expE.More(); expE.Next())
-+          if (MEF.FindFromKey(expE.Current()).Extent() == 1)
-+            break;
-+        if (!expE.More())
-+          myBuilder.Add( Shell, itF.Key());
-+      }
-+
-+      if (S.ShapeType() == TopAbs_SOLID) {
-+        TopoDS_Solid Solid;
-+        myBuilder.MakeSolid( Solid );
-+        myBuilder.Add (Solid, Shell);
-+        myBuilder.Add (C, Solid);
-+      }
-+      else
-+        myBuilder.Add (C, Shell);
-+    }
-+    else {
-+      if (myImageShape.HasImage( S )) {
-+        for (it.Initialize( myImageShape.Image(S).First()); it.More(); it.Next())
-+          myBuilder.Add (C, it.Value());
-+      }
-+    }
-+  }
-+  
-+  myShape = C;
-+}
-+
-+//=======================================================================
-+//function : CheckTool
-+//purpose  : Return True if <S>  is  a tool shape. Prepare tool
-+//           faces of <S> for the search of internal faces.
-+//=======================================================================
-+
-+Standard_Boolean Partition_Spliter::CheckTool(const TopoDS_Shape& S)
-+{
-+  // suppose S has not an image
-+  
-+  Standard_Boolean isTool = Standard_False;
-+  TopoDS_Compound C;
-+  myBuilder.MakeCompound( C );
-+
-+  TopExp_Explorer expF( S, TopAbs_FACE);
-+  for (; expF.More(); expF.Next()) {
-+
-+    const TopoDS_Face& F = TopoDS::Face( expF.Current() );
-+    if (myMapTools.Contains( F ))
-+      isTool = Standard_True;
-+    else
-+      continue;
-+
-+    if (myImagesFaces.HasImage( F )) {
-+      // F has been reconstructed
-+      TopAbs_Orientation Fori = F.Orientation();
-+      TopTools_ListOfShape LNF;
-+      myImagesFaces.LastImage( F, LNF);
-+      TopTools_ListIteratorOfListOfShape itF (LNF);
-+      for ( ; itF.More(); itF.Next())
-+      myBuilder.Add( C, itF.Value().Oriented(Fori) );
-+      continue;
-+    }
-+    
-+    Standard_Boolean hasSectionE = myInter3d.HasSectionEdge( F );
-+    Standard_Boolean hasNewE     = myAsDes->HasDescendant( F );
-+    if (!hasSectionE && !hasNewE)
-+    {
-+      // F intersects nothing
-+      myBuilder.Add( C, F );
-+      continue;
-+    }
-+    
-+    // make an image for F
-+    
-+    TopoDS_Face NF = F;
-+    NF.Orientation(TopAbs_FORWARD);
-+    NF = TopoDS::Face( NF.EmptyCopied() ); // make a copy
-+    TopoDS_Wire NW;
-+    myBuilder.MakeWire( NW );
-+
-+    // add edges, as less as possible
-+    TopTools_ListOfShape NEL;
-+    TopTools_ListIteratorOfListOfShape itNE;
-+    if (hasSectionE) {
-+      // add section edges
-+      TopExp_Explorer expE;
-+      for ( ; expE.More(); expE.Next()) {
-+      if (! myImagesEdges.HasImage( expE.Current() ))
-+        continue;
-+      myImagesEdges.LastImage( expE.Current(), NEL );
-+      for ( itNE.Initialize( NEL ); itNE.More(); itNE.Next())
-+        myBuilder.Add ( NW, itNE.Value());
-+      }
-+    }
-+    if (hasNewE) {
-+      // add new adges
-+      NEL = myAsDes->Descendant( F );
-+      for ( itNE.Initialize( NEL ); itNE.More(); itNE.Next()) {
-+      TopTools_ListOfShape SEL; // splits
-+      myImagesEdges.LastImage( itNE.Value(), SEL );
-+      TopTools_ListIteratorOfListOfShape itSE (SEL);
-+      for ( ; itSE.More(); itSE.Next()) 
-+        myBuilder.Add ( NW, itSE.Value());
-+      }
-+    }
-+    myBuilder.Add( NF, NW );
-+    myBuilder.Add (C, NF);
-+    
-+    NF.Orientation( F.Orientation() ); // NF is most probably invalid
-+    myImagesFaces.Bind (F, NF);
-+  }
-+  if (isTool)
-+    myImageShape.Bind (S, C);
-+
-+  return isTool;
-+}
-+
-+//=======================================================================
-+//function : IsInside
-+//purpose  : Return True if the first vertex of S1 inside S2.
-+//           If S1.IsNull(), check infinite point against S2.
-+//=======================================================================
-+
-+Standard_Boolean Partition_Spliter::IsInside (const TopoDS_Shape& theS1,
-+                                              const TopoDS_Shape& theS2)
-+{
-+  BRepClass3d_SolidClassifier aClassifier( theS2 );
-+
-+  TopExp_Explorer expl( theS1, TopAbs_VERTEX );
-+  if (!expl.More())
-+    aClassifier.PerformInfinitePoint( ::RealSmall());
-+  else
-+  {
-+    const TopoDS_Vertex & aVertex = TopoDS::Vertex( expl.Current() );
-+    aClassifier.Perform (BRep_Tool::Pnt( aVertex ),
-+                         BRep_Tool::Tolerance( aVertex ));
-+  }
-+
-+  return ( aClassifier.State() == TopAbs_IN );
-+}
-+
-+//=======================================================================
-+//function : GetOriginalShape
-+//purpose  : Return the  shape  aShape  originates from. aShape
-+//           should be a face or more complex result shape
-+//=======================================================================
-+
-+TopoDS_Shape Partition_Spliter::GetOriginalShape(const TopoDS_Shape& theShape) const
-+{
-+  TopoDS_Shape anOrigShape;
-+
-+  TopExp_Explorer expl( theShape, TopAbs_FACE);
-+  if (expl.More())
-+  {
-+
-+    TopoDS_Shape aFace = expl.Current();
-+    if (myImagesFaces.IsImage( aFace ))
-+      aFace = myImagesFaces.Root( aFace );
-+    anOrigShape = myFaceShapeMap.Find( aFace );
-+  }
-+  return anOrigShape;
-+}
-+
-+//=======================================================================
-+//function : FindToolsToReconstruct
-+//purpose  : find and store  as  objects  tools which interfere
-+//           with  solids   or   are   inside   solids  without
-+//           an interference
-+//=======================================================================
-+
-+void Partition_Spliter::FindToolsToReconstruct()
-+{
-+  if (myMapTools.IsEmpty())
-+    return;
-+
-+  Standard_Integer nbFoundTools = 0;
-+
-+  // build edge - face map in order to detect interference with section edges
-+  TopTools_IndexedDataMapOfShapeListOfShape EFM;
-+  TopTools_MapIteratorOfMapOfShape aMapIt;
-+  for (aMapIt.Initialize(myMapTools); aMapIt.More(); aMapIt.Next())
-+    TopExp::MapShapesAndAncestors( aMapIt.Key(), TopAbs_EDGE, TopAbs_FACE, EFM);
-+  for (aMapIt.Initialize(myMapFaces); aMapIt.More(); aMapIt.Next())
-+    TopExp::MapShapesAndAncestors( aMapIt.Key(), TopAbs_EDGE, TopAbs_FACE, EFM);
-+
-+  TopTools_MapOfShape aCurrentSolids, aCheckedShapes;
-+
-+  // faces cut by new edges
-+  TopTools_MapOfShape & aSectionFaces = myInter3d.TouchedFaces();
-+
-+  // keep solids interfering with each other in aCurrentSolids map
-+  // and add tool faces intersecting solids as object shapes
-+
-+  TopTools_ListIteratorOfListOfShape itS, itF, itCF, itE;
-+  for (itS.Initialize( myListShapes ); itS.More(); itS.Next()) {
-+    TopExp_Explorer expSo (itS.Value(), TopAbs_SOLID);
-+    for (; expSo.More(); expSo.Next()) {
-+
-+      // check if a solid has been already processed
-+      const TopoDS_Shape & aSo = expSo.Current();
-+      if (!aCheckedShapes.Add( aSo ))
-+        continue;
-+      aCurrentSolids.Add( aSo );
-+
-+      // faces to check
-+      TopTools_ListOfShape aFacesToCheck;
-+      TopExp_Explorer exp( aSo, TopAbs_FACE );
-+      for ( ; exp.More(); exp.Next())
-+        aFacesToCheck.Append ( exp.Current());
-+
-+      // add other shapes interefering with a solid.
-+      // iterate faces to check while appending new ones
-+      for (itCF.Initialize (aFacesToCheck) ; itCF.More(); itCF.Next())
-+      {
-+        const TopoDS_Shape& aCheckFace = itCF.Value();
-+//         if (!aCheckedShapes.Add( aCheckFace ))
-+//           continue;
-+
-+        // find faces interfering with aCheckFace
-+        TopTools_ListOfShape anIntFaces;
-+
-+        // ** 1. faces intersecting aCheckFace with creation of new edges on it
-+        if ( myAsDes->HasDescendant( aCheckFace ))
-+        {
-+          // new edges on aCheckFace
-+          const TopTools_ListOfShape& NEL = myAsDes->Descendant( aCheckFace );
-+          for (itE.Initialize( NEL); itE.More(); itE.Next())
-+          {
-+            const TopoDS_Shape & aNewEdge = itE.Value();
-+            if (!aCheckedShapes.Add( aNewEdge ))
-+              continue;
-+
-+            // faces interfering by aNewEdge
-+            itF.Initialize (myAsDes->Ascendant( aNewEdge ));
-+            for (; itF.More(); itF.Next())
-+              if (aCheckFace != itF.Value())
-+                anIntFaces.Append( itF.Value() );
-+
-+            // ** 2. faces having section edge aNewEdge on aFacesToCheck
-+            if (EFM.Contains( aNewEdge))
-+            {
-+              itF.Initialize ( EFM.FindFromKey (itE.Value()));
-+              for (; itF.More(); itF.Next())
-+                if (aCheckFace != itF.Value())
-+                  anIntFaces.Append( itF.Value() );
-+            }
-+          }
-+        }
-+
-+        // ** 3. faces cut by edges of aCheckFace
-+        TopExp_Explorer expE (aCheckFace, TopAbs_EDGE);
-+        for ( ; expE.More(); expE.Next())
-+        {
-+          const TopoDS_Shape & aCheckEdge = expE.Current();
-+          if (aCheckedShapes.Add( aCheckEdge ) &&
-+              myInter3d.IsSectionEdge( TopoDS::Edge( aCheckEdge )))
-+          {
-+            itF.Initialize( myInter3d.SectionEdgeFaces( TopoDS::Edge( aCheckEdge )));
-+            for (; itF.More(); itF.Next()) 
-+              if (aCheckFace != itF.Value())
-+                anIntFaces.Append( itF.Value() );
-+          }
-+        }
-+
-+        // process faces interfering with aCheckFace and shapes they
-+        // belong to
-+        for (itF.Initialize (anIntFaces); itF.More(); itF.Next())
-+        {
-+          const TopoDS_Shape & F = itF.Value();
-+          if (! aCheckedShapes.Add( F ))
-+            continue;
-+
-+          Standard_Boolean isTool = myMapTools.Contains( F );
-+          if (isTool && 
-+              myFaceShapeMap( aCheckFace ).ShapeType() == TopAbs_SOLID )
-+          {
-+            // a tool interfering with a solid
-+            if (aSectionFaces.Contains( F ))
-+              AddShape( F );
-+            ++ nbFoundTools;
-+            if (nbFoundTools == myMapTools.Extent())
-+              return;
-+          }
-+
-+          const TopoDS_Shape & S = myFaceShapeMap( F );
-+          if (aCheckedShapes.Add( S ))
-+          {
-+            // a new shape interefering with aCurrentSolids is found
-+            if (!isTool && S.ShapeType() == TopAbs_SOLID)
-+              aCurrentSolids.Add ( S );
-+            // add faces to aFacesToCheck list
-+            for ( exp.Init( S, TopAbs_FACE ); exp.More(); exp.Next())
-+              aFacesToCheck.Append ( exp.Current() );
-+          }
-+        }
-+      } // loop on aFacesToCheck
-+
-+      // Here aCurrentSolids contains all solids interfering with each other.
-+      // aCheckedShapes contains all faces belonging to shapes included
-+      // in or interfering with aCurrentSolids or previously checked solids.
-+      // Test if tool faces that do not interefere with other shapes are
-+      // wrapped by any of aCurrentSolids
-+
-+      TopTools_MapIteratorOfMapOfShape aSolidIt (aCurrentSolids);
-+      for ( ; aSolidIt.More(); aSolidIt.Next())
-+      {
-+        const TopoDS_Shape & aSolid = aSolidIt.Key();
-+        TopTools_MapOfShape aCheckedTools( myMapTools.Extent() );
-+
-+        TopTools_MapIteratorOfMapOfShape aToolIt (myMapTools);
-+        for ( ; aToolIt.More(); aToolIt.Next())
-+        {
-+          const TopoDS_Shape & aToolFace = aToolIt.Key();
-+          if (aCheckedShapes.Contains( aToolFace ) || // already found
-+              aCheckedTools.Contains( aToolFace ))    // checked against aSolid
-+            continue;
-+
-+          const TopoDS_Shape & aToolShape = myFaceShapeMap( aToolFace );
-+          TopExp_Explorer aToolFaceIt( aToolShape, TopAbs_FACE );
-+          
-+          Standard_Boolean isInside = IsInside( aToolShape, aSolid );
-+          for ( ; aToolFaceIt.More(); aToolFaceIt.Next() )
-+          {
-+            const TopoDS_Shape & aTool = aToolFaceIt.Current();
-+            aCheckedTools.Add( aTool );
-+            if (isInside)
-+            {
-+              if (aSectionFaces.Contains( aTool ))
-+                AddShape( aTool );
-+              ++ nbFoundTools;
-+              if (nbFoundTools == myMapTools.Extent())
-+                return;
-+              aCheckedShapes.Add( aTool );
-+            }
-+          }
-+        }
-+      }
-+      
-+    } // loop on solid shapes
-+  }
-+}
-+
-+#endif
 diff -Naur --exclude=CVS netgen-4.5_orig/libsrc/occ/occconstruction.cpp netgen-4.5_new/libsrc/occ/occconstruction.cpp
 --- netgen-4.5_orig/libsrc/occ/occconstruction.cpp     2005-12-06 18:15:53.000000000 +0300
 +++ netgen-4.5_new/libsrc/occ/occconstruction.cpp      2010-06-23 13:19:48.000000000 +0400