0026426: Draft angle algorithm modifies input argument + the result of the operation...
authorifv <ifv@opencascade.com>
Fri, 17 Jul 2015 06:43:21 +0000 (09:43 +0300)
committerbugmaster <bugmaster@opencascade.com>
Thu, 29 Oct 2015 10:36:17 +0000 (13:36 +0300)
Test-case for issue #26426

src/BRepOffsetAPI/BRepOffsetAPI_DraftAngle.cxx
src/BRepOffsetAPI/BRepOffsetAPI_DraftAngle.hxx
src/Draft/Draft_Modification.cxx
src/Draft/Draft_Modification_1.cxx
tests/bugs/modalg_6/bug26426 [new file with mode: 0644]
tests/draft/angle/G2
tests/draft/angle/K5
tests/draft/angle/K7
tests/draft/angle/M2
tests/draft/angle/M4

index 0bdea46..d2522e8 100644 (file)
@@ -251,6 +251,23 @@ const TopTools_ListOfShape& BRepOffsetAPI_DraftAngle::Modified(const TopoDS_Shap
   return myGenerated;
 }
 
+//=======================================================================
+//function : ModifiedShape
+//purpose  : 
+//=======================================================================
+
+TopoDS_Shape BRepOffsetAPI_DraftAngle::ModifiedShape
+  (const TopoDS_Shape& S) const
+{
+  if(S.ShapeType() == TopAbs_VERTEX)
+  {
+    if(myVtxToReplace.IsBound(S))
+    {
+      return myVtxToReplace(S);
+    }
+  }
+  return myModifier.ModifiedShape(S);
+}
 
 //=======================================================================
 //function : Build
@@ -265,9 +282,8 @@ void BRepOffsetAPI_DraftAngle::Build()
   }
   else {
     DoModif(myInitialShape);
-    //BRepLib::SameParameter( myShape, 1.0e-7, Standard_True ); //patch
     CorrectWires();
-    BRepLib::SameParameter( myShape, 1.0e-7, Standard_True ); //patch
+    CorrectVertexTol();
   }
 }
 
@@ -289,29 +305,29 @@ void BRepOffsetAPI_DraftAngle::CorrectWires()
 
   TopExp_Explorer fexp( myShape, TopAbs_FACE );
   for (; fexp.More(); fexp.Next())
+  {
+    CurFace = fexp.Current();
+    wit.Initialize( CurFace );
+    for (; wit.More(); wit.Next())
     {
-      CurFace = fexp.Current();
-      wit.Initialize( CurFace );
-      for (; wit.More(); wit.Next())
-       {
-         CurWire = wit.Value();
-         TopTools_MapOfShape emap;
-         eit.Initialize( CurWire );
-         for (; eit.More(); eit.Next())
-           emap.Add( eit.Value() );
-         TopTools_MapIteratorOfMapOfShape mapit( emap );
-         for (; mapit.More(); mapit.Next())
-           {
-             CurEdge = mapit.Key();
-             if (BRepTools::IsReallyClosed( TopoDS::Edge(CurEdge), TopoDS::Face(CurFace) ))
-               {
-                 Eseq.Append( CurEdge );
-                 Wseq.Append( CurWire );
-                 Fseq.Append( CurFace );
-               }
-           }
-       }
+      CurWire = wit.Value();
+      TopTools_MapOfShape emap;
+      eit.Initialize( CurWire );
+      for (; eit.More(); eit.Next())
+        emap.Add( eit.Value() );
+      TopTools_MapIteratorOfMapOfShape mapit( emap );
+      for (; mapit.More(); mapit.Next())
+      {
+        CurEdge = mapit.Key();
+        if (BRepTools::IsReallyClosed( TopoDS::Edge(CurEdge), TopoDS::Face(CurFace) ))
+        {
+          Eseq.Append( CurEdge );
+          Wseq.Append( CurWire );
+          Fseq.Append( CurFace );
+        }
+      }
     }
+  }
 
   BRepFill_DataMapOfShapeSequenceOfReal Emap;
 
@@ -324,551 +340,639 @@ void BRepOffsetAPI_DraftAngle::CorrectWires()
   TopTools_DataMapOfShapeShape WFmap;
   TopTools_DataMapOfShapeListOfShape WWmap;
   for (i = 1; i <= Eseq.Length(); i++)
+  {
+    CurEdge = Eseq(i);
+    CurWire = Wseq(i);
+    CurFace = Fseq(i);
+    wit.Initialize( CurFace );
+    for (; wit.More(); wit.Next())
     {
-      CurEdge = Eseq(i);
-      CurWire = Wseq(i);
-      CurFace = Fseq(i);
-      wit.Initialize( CurFace );
-      for (; wit.More(); wit.Next())
-       {
-         TopoDS_Shape aWire = wit.Value();
-         if (! aWire.IsSame( CurWire ))
-           {
-             TColgp_SequenceOfPnt pts;
-             TopTools_SequenceOfShape edges;
-             TColStd_SequenceOfReal pars;
-             Standard_Boolean Wadd = Standard_False;
-             eit.Initialize( aWire );
-             for (; eit.More(); eit.Next())
-               {
-                 TopoDS_Shape anEdge = eit.Value();
-                 TopOpeBRep_EdgesIntersector EInter;
-                 EInter.SetFaces( CurFace, CurFace );
-                 EInter.ForceTolerances( TolInter, TolInter );
-                 EInter.Perform( CurEdge, anEdge );
-                 if (EInter.IsEmpty())
-                   {
-                     EInter.Perform( CurEdge.Reversed(), anEdge );
-                     if (EInter.IsEmpty())
-                       continue;
-                   }
-                 Wadd = Standard_True;
-                 if (! WFmap.IsBound( aWire ))
-                   WFmap.Bind( aWire, CurFace );
-                 Standard_Integer ind = 0;
-                 for (j = 1; j <= NonSeam.Length(); j++)
-                   if (anEdge.IsSame( NonSeam(j) ))
-                     {
-                       ind = j;
-                       break;
-                     }
-                 if (ind == 0)
-                   {
-                     NonSeam.Append( anEdge );
-                     NonSeamWires.Append( aWire );
-                     ind = NonSeam.Length();
-                     TColStd_SequenceOfReal emptyseq1, emptyseq2;
-                     TopTools_SequenceOfShape emptyedgeseq;
-                     ParsNonSeam.Append( emptyseq1 );
-                     Seam.Append( emptyedgeseq );
-                     ParsSeam.Append( emptyseq2 );
-                   }
-                 if (! Emap.IsBound( CurEdge ))
-                   {
-                     TColStd_SequenceOfReal emptyseq;
-                     Emap.Bind( CurEdge, emptyseq );
-                   }
-                 EInter.InitPoint();
-                 for (; EInter.MorePoint(); EInter.NextPoint())
-                   {
-                     const TopOpeBRep_Point2d& bp = EInter.Point();
-                     if (bp.IsVertex(2))
-                       {
-                         gp_Pnt Pnt = bp.Value();
-                         Standard_Integer ied = 0;
-                         for (j = 1; j <= pts.Length(); j++)
-                           if (Pnt.IsEqual( pts(j), Precision::Confusion() ))
-                             {
-                               ied = j;
-                               break;
-                             }
-                         if (ied == 0)
-                           {
-                             pts.Append( Pnt );
-                             edges.Append( anEdge );
-                             pars.Append( bp.Parameter(2) );
-                             Emap(CurEdge).Append( bp.Parameter(1) );
-                             ParsNonSeam(ind).Append( bp.Parameter(2) );
-                             Seam(ind).Append( CurEdge );
-                             ParsSeam(ind).Append( bp.Parameter(1) );
-                           }
-                         /*
-                         else
-                           {
-                             Standard_Real ParOnSeam = bp.Parameter(1);
-                             Standard_Real Par1 = pars(ied);
-                             Standard_Real Par2 = bp.Parameter(2);
-                             BRepAdaptor_Curve2d SeamCurve( CurEdge, CurFace );
-                             BRepAdaptor_Curve2d Curve1( edges(ied), CurFace );
-                             BRepAdaptor_Curve2d Curve2( anEdge. CurFace );
-                             gp_Pnt2d P2d;
-                             gp_Vec2d SeamDer, Der1, Der2;
-                             //SeamCurve->D1( ParOnSeam, P2d, SeamDer );
-                             //Curve1->D1( Par1, P2d, Der1 );
-                             //Curve2->D1( Par2, P2d, Der2 );
-                             Standard_Real Crossed1 = SeamDer ^ Der1;
-                             Standard_Real Crossed2 = SeamDer ^ Der2;
-                             //if (Crossed1 > 0
-                           }
-                         */
-                       }
-                     else // ! bp.IsVertex(2)
-                       {
-                         //Temporary the case of tangency is not implemented
-                         Emap(CurEdge).Append( bp.Parameter(1) );
-                         ParsNonSeam(ind).Append( bp.Parameter(2) );
-                         Seam(ind).Append( CurEdge );
-                         ParsSeam(ind).Append( bp.Parameter(1) );
-                       }
-                   } //for (; EInter.MorePoint(); EInter.NextPoint())
-               } //for (; eit.More(); eit.Next())
-             if (Wadd)
-               {
-                 if (! WWmap.IsBound( CurWire ))
-                   {
-                     TopTools_ListOfShape emptylist;
-                     WWmap.Bind( CurWire, emptylist );
-                   }
-                 WWmap(CurWire).Append( aWire );
-               }
-           } //if (! aWire.IsSame( CurWire ))
-       } //for (; wit.More(); wit.Next())
-    } //for (i = 1; i <= Eseq.Length(); i++)
+      TopoDS_Shape aWire = wit.Value();
+      if (! aWire.IsSame( CurWire ))
+      {
+        TColgp_SequenceOfPnt pts;
+        TopTools_SequenceOfShape edges;
+        TColStd_SequenceOfReal pars;
+        Standard_Boolean Wadd = Standard_False;
+        eit.Initialize( aWire );
+        for (; eit.More(); eit.Next())
+        {
+          TopoDS_Shape anEdge = eit.Value();
+          TopOpeBRep_EdgesIntersector EInter;
+          EInter.SetFaces( CurFace, CurFace );
+          EInter.ForceTolerances( TolInter, TolInter );
+          EInter.Perform( CurEdge, anEdge );
+          if (EInter.IsEmpty())
+          {
+            EInter.Perform( CurEdge.Reversed(), anEdge );
+            if (EInter.IsEmpty())
+              continue;
+          }
+          Wadd = Standard_True;
+          if (! WFmap.IsBound( aWire ))
+            WFmap.Bind( aWire, CurFace );
+          Standard_Integer ind = 0;
+          for (j = 1; j <= NonSeam.Length(); j++)
+            if (anEdge.IsSame( NonSeam(j) ))
+            {
+              ind = j;
+              break;
+            }
+            if (ind == 0)
+            {
+              NonSeam.Append( anEdge );
+              NonSeamWires.Append( aWire );
+              ind = NonSeam.Length();
+              TColStd_SequenceOfReal emptyseq1, emptyseq2;
+              TopTools_SequenceOfShape emptyedgeseq;
+              ParsNonSeam.Append( emptyseq1 );
+              Seam.Append( emptyedgeseq );
+              ParsSeam.Append( emptyseq2 );
+            }
+            if (! Emap.IsBound( CurEdge ))
+            {
+              TColStd_SequenceOfReal emptyseq;
+              Emap.Bind( CurEdge, emptyseq );
+            }
+            EInter.InitPoint();
+            for (; EInter.MorePoint(); EInter.NextPoint())
+            {
+              const TopOpeBRep_Point2d& bp = EInter.Point();
+              if (bp.IsVertex(2))
+              {
+                gp_Pnt Pnt = bp.Value();
+                Standard_Integer ied = 0;
+                for (j = 1; j <= pts.Length(); j++)
+                  if (Pnt.IsEqual( pts(j), Precision::Confusion() ))
+                  {
+                    ied = j;
+                    break;
+                  }
+                  if (ied == 0)
+                  {
+                    pts.Append( Pnt );
+                    edges.Append( anEdge );
+                    pars.Append( bp.Parameter(2) );
+                    Emap(CurEdge).Append( bp.Parameter(1) );
+                    ParsNonSeam(ind).Append( bp.Parameter(2) );
+                    Seam(ind).Append( CurEdge );
+                    ParsSeam(ind).Append( bp.Parameter(1) );
+                  }
+                  /*
+                  else
+                  {
+                  Standard_Real ParOnSeam = bp.Parameter(1);
+                  Standard_Real Par1 = pars(ied);
+                  Standard_Real Par2 = bp.Parameter(2);
+                  BRepAdaptor_Curve2d SeamCurve( CurEdge, CurFace );
+                  BRepAdaptor_Curve2d Curve1( edges(ied), CurFace );
+                  BRepAdaptor_Curve2d Curve2( anEdge. CurFace );
+                  gp_Pnt2d P2d;
+                  gp_Vec2d SeamDer, Der1, Der2;
+                  //SeamCurve->D1( ParOnSeam, P2d, SeamDer );
+                  //Curve1->D1( Par1, P2d, Der1 );
+                  //Curve2->D1( Par2, P2d, Der2 );
+                  Standard_Real Crossed1 = SeamDer ^ Der1;
+                  Standard_Real Crossed2 = SeamDer ^ Der2;
+                  //if (Crossed1 > 0
+                  }
+                  */
+              }
+              else // ! bp.IsVertex(2)
+              {
+                //Temporary the case of tangency is not implemented
+                Emap(CurEdge).Append( bp.Parameter(1) );
+                ParsNonSeam(ind).Append( bp.Parameter(2) );
+                Seam(ind).Append( CurEdge );
+                ParsSeam(ind).Append( bp.Parameter(1) );
+              }
+            } //for (; EInter.MorePoint(); EInter.NextPoint())
+        } //for (; eit.More(); eit.Next())
+        if (Wadd)
+        {
+          if (! WWmap.IsBound( CurWire ))
+          {
+            TopTools_ListOfShape emptylist;
+            WWmap.Bind( CurWire, emptylist );
+          }
+          WWmap(CurWire).Append( aWire );
+        }
+      } //if (! aWire.IsSame( CurWire ))
+    } //for (; wit.More(); wit.Next())
+  } //for (i = 1; i <= Eseq.Length(); i++)
 
   //Sorting
   for (i = 1; i <= NonSeam.Length(); i++)
     for (j = 1; j < ParsNonSeam(i).Length(); j++)
       for (k = j+1; k <= ParsNonSeam(i).Length(); k++)
-       if (ParsNonSeam(i)(k) < ParsNonSeam(i)(j))
-         {
-           Standard_Real temp = ParsNonSeam(i)(j);
-           ParsNonSeam(i)(j) = ParsNonSeam(i)(k);
-           ParsNonSeam(i)(k) = temp;
-           TopoDS_Shape tmp = Seam(i)(j);
-           Seam(i)(j) = Seam(i)(k);
-           Seam(i)(k) = tmp;
-           temp = ParsSeam(i)(j);
-           ParsSeam(i)(j) = ParsSeam(i)(k);
-           ParsSeam(i)(k) = temp;
-         }
-  BRepFill_DataMapIteratorOfDataMapOfShapeSequenceOfReal iter( Emap );
-  for (; iter.More(); iter.Next())
-    {
-      TColStd_SequenceOfReal Seq;
-      Seq = iter.Value();
-      for (i = 1; i < Seq.Length(); i++)
-      for (j = i+1; j <= Seq.Length(); j++)
-       if (Seq(j) < Seq(i))
-         {
-           Standard_Real temp = Seq(i);
-           Seq(i) = Seq(j);
-           Seq(j) = temp;
-         }
-      Emap( iter.Key() ) = Seq;
-    }
-  BRepFill_DataMapOfShapeSequenceOfReal EPmap;
-  TopTools_DataMapOfShapeSequenceOfShape EVmap; //Seam
-  TopTools_DataMapOfShapeSequenceOfShape EWmap; //Seam and wires intersecting it
-  iter.Initialize( Emap );
-  for (; iter.More(); iter.Next())
-    {
-      TColStd_SequenceOfReal parseq;
-      EPmap.Bind( iter.Key(), parseq );
-      TopTools_SequenceOfShape shapeseq;
-      EVmap.Bind( iter.Key(), shapeseq );
-      TopTools_SequenceOfShape shapeseq2;
-      EWmap.Bind( iter.Key(), shapeseq2 );
-    }
+        if (ParsNonSeam(i)(k) < ParsNonSeam(i)(j))
+        {
+          Standard_Real temp = ParsNonSeam(i)(j);
+          ParsNonSeam(i)(j) = ParsNonSeam(i)(k);
+          ParsNonSeam(i)(k) = temp;
+          TopoDS_Shape tmp = Seam(i)(j);
+          Seam(i)(j) = Seam(i)(k);
+          Seam(i)(k) = tmp;
+          temp = ParsSeam(i)(j);
+          ParsSeam(i)(j) = ParsSeam(i)(k);
+          ParsSeam(i)(k) = temp;
+        }
+        BRepFill_DataMapIteratorOfDataMapOfShapeSequenceOfReal iter( Emap );
+        for (; iter.More(); iter.Next())
+        {
+          TColStd_SequenceOfReal Seq;
+          Seq = iter.Value();
+          for (i = 1; i < Seq.Length(); i++)
+            for (j = i+1; j <= Seq.Length(); j++)
+              if (Seq(j) < Seq(i))
+              {
+                Standard_Real temp = Seq(i);
+                Seq(i) = Seq(j);
+                Seq(j) = temp;
+              }
+              Emap( iter.Key() ) = Seq;
+        }
+        BRepFill_DataMapOfShapeSequenceOfReal EPmap;
+        TopTools_DataMapOfShapeSequenceOfShape EVmap; //Seam
+        TopTools_DataMapOfShapeSequenceOfShape EWmap; //Seam and wires intersecting it
+        iter.Initialize( Emap );
+        for (; iter.More(); iter.Next())
+        {
+          TColStd_SequenceOfReal parseq;
+          EPmap.Bind( iter.Key(), parseq );
+          TopTools_SequenceOfShape shapeseq;
+          EVmap.Bind( iter.Key(), shapeseq );
+          TopTools_SequenceOfShape shapeseq2;
+          EWmap.Bind( iter.Key(), shapeseq2 );
+        }
+
+        //Reconstruction of non-seam edges
+        BRepTools_Substitution aSub;
+        BRep_Builder BB;
+        for (i = 1; i <= NonSeam.Length(); i++)
+        {
+          TopoDS_Edge anEdge = TopoDS::Edge( NonSeam(i) );
+          TopTools_ListOfShape NewEdges;
+          TopoDS_Edge NewE;
+          TopoDS_Vertex Vfirst, Vlast;
+          TopExp::Vertices( anEdge, Vfirst, Vlast );
+          Standard_Real par, FirstPar, LastPar;
+          BRep_Tool::Range( anEdge, FirstPar, LastPar );
+          Standard_Integer firstind = 1;
+          par = ParsNonSeam(i)(1);
+          TopoDS_Edge SeamEdge = TopoDS::Edge( Seam(i)(1) );
+          //Find the face
+          for (j = 1; j <= Eseq.Length(); j++)
+            if (SeamEdge.IsSame( Eseq(j) ))
+              break;
+          TopoDS_Face theFace = TopoDS::Face( Fseq(j) );
+          TopLoc_Location L;
+          Handle( Geom_Surface ) theSurf = BRep_Tool::Surface( theFace, L );
+          if (Abs(par-FirstPar) <= Precision::Confusion())
+          {
+            BB.UpdateVertex( Vfirst, ParsSeam(i)(1), SeamEdge, BRep_Tool::Tolerance(Vfirst) );
+            EPmap( SeamEdge ).Append( ParsSeam(i)(1) );
+            EVmap( SeamEdge ).Append( Vfirst );
+            EWmap( SeamEdge ).Append( NonSeamWires(i) );
+            firstind = 2;
+          }
+          Standard_Real prevpar = FirstPar;
+          TopoDS_Vertex PrevV = Vfirst;
+          for (j = firstind; j <= ParsNonSeam(i).Length(); j++)
+          {
+            TopoDS_Shape aLocalShape = anEdge.EmptyCopied();
+            NewE = TopoDS::Edge( aLocalShape );
+            //NewE = TopoDS::Edge( anEdge.EmptyCopied() );
+            TopoDS_Vertex NewV;
+            par = ParsNonSeam(i)(j);
+            BB.Range( NewE, prevpar, par );
+            SeamEdge = TopoDS::Edge( Seam(i)(j) );
+            if (j == ParsNonSeam(i).Length() && Abs(par-LastPar) <= Precision::Confusion())
+            {
+              NewV = Vlast;
+              if (firstind == 2 && j == 2)
+              {
+                BB.UpdateVertex( Vlast, ParsSeam(i)(j), SeamEdge, BRep_Tool::Tolerance(Vlast) );
+                EPmap( SeamEdge ).Append( ParsSeam(i)(j) );
+                EVmap( SeamEdge ).Append( Vlast );
+                EWmap( SeamEdge ).Append( NonSeamWires(i) );
+                break;
+              }
+            }
+            else
+            {
+              BRepAdaptor_Curve bcur( NewE );
+              gp_Pnt Point = bcur.Value( par );
+              NewV = BRepLib_MakeVertex( Point );
+              BB.UpdateVertex( NewV, par, NewE, 10.*Precision::Confusion() );
+            }
+            BB.UpdateVertex( NewV, ParsSeam(i)(j), SeamEdge, 10.*Precision::Confusion() );
+            NewE.Orientation( TopAbs_FORWARD );
+            BB.Add( NewE, PrevV.Oriented(TopAbs_FORWARD) );
+            BB.Add( NewE, NewV.Oriented(TopAbs_REVERSED) );
+
+            NewEdges.Append( NewE );
+            EPmap( SeamEdge ).Append( ParsSeam(i)(j) );
+            EVmap( SeamEdge ).Append( NewV );
+            EWmap( SeamEdge ).Append( NonSeamWires(i) );
+
+            prevpar = par;
+            PrevV = NewV;
+          }
+          //The last edge
+          TopoDS_Shape aLocalShape = anEdge.EmptyCopied();
+          NewE = TopoDS::Edge( aLocalShape );
+          //NewE = TopoDS::Edge( anEdge.EmptyCopied() );
+          par = LastPar;
+          if (Abs(prevpar-par) > Precision::Confusion())
+          {
+            BB.Range( NewE, prevpar, par );
+            NewE.Orientation( TopAbs_FORWARD );
+            BB.Add( NewE, PrevV.Oriented(TopAbs_FORWARD) );
+            BB.Add( NewE, Vlast.Oriented(TopAbs_REVERSED) );
+            NewEdges.Append( NewE );
+          }
+
+          //Substitute anEdge by NewEdges
+          aSub.Substitute( anEdge, NewEdges );
+        }
+
+        //Sorting of EPmap and EVmap and removing repeating points from them
+        iter.Initialize( EPmap );
+        for (; iter.More(); iter.Next())
+        {
+          TColStd_SequenceOfReal Seq;
+          Seq = iter.Value();
+          TopTools_SequenceOfShape SeqShape;
+          SeqShape = EVmap( iter.Key() );
+          TopTools_SequenceOfShape SeqShape2;
+          SeqShape2 = EWmap( iter.Key() );
+          for (i = 1; i < Seq.Length(); i++)
+            for (j = i+1; j <= Seq.Length(); j++)
+              if (Seq(j) < Seq(i))
+              {
+                Standard_Real temp = Seq(i);
+                Seq(i) = Seq(j);
+                Seq(j) = temp;
+                TopoDS_Shape tmp = SeqShape(i);
+                SeqShape(i) = SeqShape(j);
+                SeqShape(j) = tmp;
+                tmp = SeqShape2(i);
+                SeqShape2(i) = SeqShape2(j);
+                SeqShape2(j) = tmp;
+              }
+              EPmap( iter.Key() ) = Seq;
+              EVmap( iter.Key() ) = SeqShape;
+              EWmap( iter.Key() ) = SeqShape2;
+        }
+        iter.Initialize( EPmap );
+        for (; iter.More(); iter.Next())
+        {
+          TColStd_SequenceOfReal Seq;
+          Seq = iter.Value();
+          TopTools_SequenceOfShape SeqShape;
+          SeqShape = EVmap( iter.Key() );
+          TopTools_SequenceOfShape SeqShape2;
+          SeqShape2 = EWmap( iter.Key() );
+          Standard_Boolean remove = Standard_True;
+          while (remove)
+          {
+            remove = Standard_False;
+            for (i = 1; i < Seq.Length(); i++)
+              if (Abs(Seq(i)-Seq(i+1)) <= Precision::Confusion())
+              {
+                Seq.Remove(i+1);
+                SeqShape.Remove(i+1);
+                SeqShape2.Remove(i+1);
+                remove = Standard_True;
+              }
+          }
+          EPmap( iter.Key() ) = Seq;
+          EVmap( iter.Key() ) = SeqShape;
+          EWmap( iter.Key() ) = SeqShape2;
+        }
+
+        //Reconstruction of seam edges
+        TopTools_DataMapOfShapeShape VEmap;
+        iter.Initialize( Emap );
+        for (; iter.More(); iter.Next())
+        {
+          TopoDS_Edge anEdge = TopoDS::Edge( iter.Key() );
+          Standard_Boolean onepoint = Standard_False;
+          TopTools_ListOfShape NewEdges;
+          TColStd_SequenceOfReal Seq;
+          Seq = iter.Value();
+          TColStd_SequenceOfReal Seq2;
+          Seq2 = EPmap( anEdge );
+          TopTools_SequenceOfShape SeqVer;
+          SeqVer = EVmap( anEdge );
+          TopTools_SequenceOfShape SeqWire;
+          SeqWire = EWmap( anEdge );
+          TopoDS_Vertex Vfirst, Vlast;
+          TopExp::Vertices( anEdge, Vfirst, Vlast );
+          Standard_Real fpar, lpar, FirstPar, LastPar;
+          BRep_Tool::Range( anEdge, FirstPar, LastPar );
+          fpar = FirstPar;
+          lpar = Seq(1);
+          TopoDS_Edge NewE;
+          Standard_Integer firstind = 1;
+          if (Abs(fpar-lpar) <= Precision::Confusion())
+          {
+            firstind = 2;
+            fpar = Seq(1);
+            lpar = Seq(2);
+          }
+          else
+          {
+            if (Seq.Length()%2 != 0)
+            {
+              VEmap.Bind( Vfirst, anEdge );
+              firstind = 2;
+              fpar = Seq(1);
+              if (Seq.Length() > 2)
+                lpar = Seq(2);
+              else
+                onepoint = Standard_True;
+            }
+          }
+          if (!onepoint)
+          {
+            TopoDS_Shape aLocalShape = anEdge.EmptyCopied();
+            NewE = TopoDS::Edge( aLocalShape );
+            //NewE = TopoDS::Edge( anEdge.EmptyCopied() );
+            BB.Range( NewE, fpar, lpar );
+            NewE.Orientation( TopAbs_FORWARD );
+            if (firstind == 1)
+            {
+              BB.Add( NewE, Vfirst.Oriented(TopAbs_FORWARD) );
+              aLocalShape = SeqVer(1).Oriented(TopAbs_REVERSED);
+              BB.Add( NewE, TopoDS::Vertex( aLocalShape ) );
+              //BB.Add( NewE, TopoDS::Vertex( SeqVer(1).Oriented(TopAbs_REVERSED) ) );
+            }
+            else
+            {
+              aLocalShape = SeqVer(1).Oriented(TopAbs_FORWARD);
+              BB.Add( NewE, TopoDS::Vertex( aLocalShape ) );
+              aLocalShape = SeqVer(2).Oriented(TopAbs_REVERSED);
+              BB.Add( NewE, TopoDS::Vertex( aLocalShape ) );
+              //BB.Add( NewE, TopoDS::Vertex( SeqVer(1).Oriented(TopAbs_FORWARD) ) );
+              //BB.Add( NewE, TopoDS::Vertex( SeqVer(2).Oriented(TopAbs_REVERSED) ) );
+            }
+            NewEdges.Append( NewE );
+
+            firstind++;
+            for (i = firstind; i < Seq.Length(); i += 2)
+            {
+              aLocalShape = anEdge.EmptyCopied();
+              NewE = TopoDS::Edge( aLocalShape );
+              //NewE = TopoDS::Edge( anEdge.EmptyCopied() );
+              fpar = Seq(i);
+              lpar = Seq(i+1);
+              BB.Range( NewE, fpar, lpar );
+              //Find vertices
+              for (j = 1; j <= Seq2.Length(); j++)
+                if (Abs(fpar-Seq2(j)) <= Precision::Confusion())
+                  break;
+              NewE.Orientation( TopAbs_FORWARD );
+              TopoDS_Shape aLocalShapeCur = SeqVer(j).Oriented(TopAbs_FORWARD);
+              BB.Add( NewE, TopoDS::Vertex( aLocalShapeCur) );
+              aLocalShapeCur = SeqVer(j+1).Oriented(TopAbs_REVERSED);
+              BB.Add( NewE, TopoDS::Vertex( aLocalShapeCur ) );
+              //BB.Add( NewE, TopoDS::Vertex( SeqVer(j).Oriented(TopAbs_FORWARD) ) );
+              //BB.Add( NewE, TopoDS::Vertex( SeqVer(j+1).Oriented(TopAbs_REVERSED) ) );
+              NewEdges.Append( NewE );
+            }
+          }
+
+          i = Seq.Length();
+          fpar = Seq(i);
+          lpar = LastPar;
+          if (Abs(fpar-lpar) <= Precision::Confusion())
+            continue;
+          TopoDS_Shape aLocalShape = anEdge.EmptyCopied();
+          NewE = TopoDS::Edge( aLocalShape );
+          //NewE = TopoDS::Edge( anEdge.EmptyCopied() );
+          BB.Range( NewE, fpar, lpar );
+          NewE.Orientation( TopAbs_FORWARD );
+          aLocalShape = SeqVer(SeqVer.Length()).Oriented(TopAbs_FORWARD);
+          BB.Add( NewE, TopoDS::Vertex( aLocalShape ) );
+          //BB.Add( NewE, TopoDS::Vertex( SeqVer(SeqVer.Length()).Oriented(TopAbs_FORWARD) ) );
+          BB.Add( NewE, Vlast.Oriented(TopAbs_REVERSED) );
+          NewEdges.Append( NewE );
+
+          //Substitute anEdge by NewEdges
+          aSub.Substitute( anEdge, NewEdges );
+        }
+
+        //Removing edges connected with missing extremities of seam edges
+        TopTools_DataMapIteratorOfDataMapOfShapeShape itve( VEmap );
+        for (; itve.More(); itve.Next())
+        {
+          TopoDS_Shape V = itve.Key();
+          TopoDS_Shape E = itve.Value();
+          TopoDS_Shape W;
+          for (i = 1; i <= Eseq.Length(); i++)
+            if (E.IsSame( Eseq(i) ))
+            {
+              W = Wseq(i);
+              break;
+            }
+            TopoDS_Shape Etoremove;
+            eit.Initialize( W );
+            for (; eit.More(); eit.Next())
+            {
+              TopoDS_Edge CurE = TopoDS::Edge( eit.Value() );
+              if (CurE.IsSame( E ))
+                continue;
+              TopoDS_Vertex Vfirst, Vlast;
+              TopExp::Vertices( CurE, Vfirst, Vlast );
+              if (Vfirst.IsSame( V ) || Vlast.IsSame( V ))
+              {
+                Etoremove = CurE;
+                break;
+              }
+            }
+            if (! Etoremove.IsNull())
+            {
+              W.Free( Standard_True );
+              BB.Remove( W, Etoremove );
+            }
+        }
+
+        aSub.Build( myShape );
+        if (aSub.IsCopied( myShape ))
+        {
+          const TopTools_ListOfShape& listSh = aSub.Copy( myShape );
+          if (! listSh.IsEmpty())
+            myShape = listSh.First();
+        }
+
+        //Reconstruction of wires
+        TopTools_ListOfShape theCopy;
+        TopTools_DataMapIteratorOfDataMapOfShapeListOfShape itww( WWmap );
+        for (; itww.More(); itww.Next())
+        {
+          CurWire = itww.Key();
+          theCopy = aSub.Copy( CurWire );
+          CurWire = theCopy.First();
+          CurWire.Free( Standard_True );
+          TopTools_ListIteratorOfListOfShape itl( itww.Value() );
+          for (; itl.More(); itl.Next())
+          {
+            TopoDS_Shape aWire = itl.Value();
+            CurFace = WFmap( aWire );
+            theCopy = aSub.Copy( aWire );
+            aWire = theCopy.First();
+            //Adjusting period
+            TopLoc_Location L;
+            Handle( Geom_Surface ) theSurf = BRep_Tool::Surface( TopoDS::Face(CurFace), L );
+            eit.Initialize( aWire );
+            for (; eit.More(); eit.Next())
+            {
+              TopoDS_Edge anEdge = TopoDS::Edge( eit.Value() );
+              gp_Pnt2d Pfirst, Plast, Pmid;
+              BRep_Tool::UVPoints( anEdge, TopoDS::Face(CurFace), Pfirst, Plast );
+              BRepAdaptor_Curve2d bc2d( anEdge, TopoDS::Face(CurFace) );
+              Pmid = bc2d.Value( (bc2d.FirstParameter()+bc2d.LastParameter())/2. );
+              gp_Vec2d offset;
+              Standard_Boolean translate = Standard_False;
+              if (Pfirst.X()-2.*M_PI > Precision::Confusion() ||
+                Plast.X()-2.*M_PI > Precision::Confusion()  ||
+                Pmid.X()-2.*M_PI > Precision::Confusion())
+              {
+                offset.SetCoord( -2.*M_PI, 0 );
+                translate = Standard_True;
+              }
+              if (Pfirst.X() < -Precision::Confusion() ||
+                Plast.X() < -Precision::Confusion()  ||
+                Pmid.X() < -Precision::Confusion())
+              {
+                offset.SetCoord( 2.*M_PI, 0 );
+                translate = Standard_True;
+              }
+              if (translate)
+              {
+                const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &anEdge.TShape());
+                BRep_ListIteratorOfListOfCurveRepresentation itcr( TE->ChangeCurves() );
+                Handle(BRep_GCurve) GC;
+
+                for (; itcr.More(); itcr.Next())
+                {
+                  GC = Handle(BRep_GCurve)::DownCast(itcr.Value());
+                  if (!GC.IsNull() && GC->IsCurveOnSurface( theSurf, L ))
+                  {
+                    Handle(Geom2d_Curve) PC = GC->PCurve();
+                    PC = Handle(Geom2d_Curve)::DownCast( PC->Translated( offset ) );
+                    GC->PCurve( PC );
+                    TE->ChangeCurves().Remove( itcr );
+                    TE->ChangeCurves().Append( GC );
+                    break;
+                  }
+                }
+              }
+            }
+            ///////////////////
+            eit.Initialize( aWire, Standard_False );
+            for (; eit.More(); eit.Next())
+            {
+              TopoDS_Shape anEdge = eit.Value();
+              BB.Add( CurWire, anEdge );
+            }
+            if (aSub.IsCopied( CurFace ))
+            {
+              theCopy = aSub.Copy( CurFace );
+              CurFace = theCopy.First();
+            }
+            CurFace.Free( Standard_True );
+            BB.Remove( CurFace, aWire );
+          }
+        }
+}
+//=======================================================================
+//function : CorrectVertexTol
+//purpose  : 
+//=======================================================================
 
-  //Reconstruction of non-seam edges
-  BRepTools_Substitution aSub;
-  BRep_Builder BB;
-  for (i = 1; i <= NonSeam.Length(); i++)
-    {
-      TopoDS_Edge anEdge = TopoDS::Edge( NonSeam(i) );
-      TopTools_ListOfShape NewEdges;
-      TopoDS_Edge NewE;
-      TopoDS_Vertex Vfirst, Vlast;
-      TopExp::Vertices( anEdge, Vfirst, Vlast );
-      Standard_Real par, FirstPar, LastPar;
-      BRep_Tool::Range( anEdge, FirstPar, LastPar );
-      Standard_Integer firstind = 1;
-      par = ParsNonSeam(i)(1);
-      TopoDS_Edge SeamEdge = TopoDS::Edge( Seam(i)(1) );
-      //Find the face
-      for (j = 1; j <= Eseq.Length(); j++)
-       if (SeamEdge.IsSame( Eseq(j) ))
-         break;
-      TopoDS_Face theFace = TopoDS::Face( Fseq(j) );
-      TopLoc_Location L;
-      Handle( Geom_Surface ) theSurf = BRep_Tool::Surface( theFace, L );
-      if (Abs(par-FirstPar) <= Precision::Confusion())
-       {
-         BB.UpdateVertex( Vfirst, ParsSeam(i)(1), SeamEdge, BRep_Tool::Tolerance(Vfirst) );
-         EPmap( SeamEdge ).Append( ParsSeam(i)(1) );
-         EVmap( SeamEdge ).Append( Vfirst );
-         EWmap( SeamEdge ).Append( NonSeamWires(i) );
-         firstind = 2;
-       }
-      Standard_Real prevpar = FirstPar;
-      TopoDS_Vertex PrevV = Vfirst;
-      for (j = firstind; j <= ParsNonSeam(i).Length(); j++)
-       {
-         TopoDS_Shape aLocalShape = anEdge.EmptyCopied();
-         NewE = TopoDS::Edge( aLocalShape );
-         //NewE = TopoDS::Edge( anEdge.EmptyCopied() );
-         TopoDS_Vertex NewV;
-         par = ParsNonSeam(i)(j);
-         BB.Range( NewE, prevpar, par );
-         SeamEdge = TopoDS::Edge( Seam(i)(j) );
-         if (j == ParsNonSeam(i).Length() && Abs(par-LastPar) <= Precision::Confusion())
-           {
-             NewV = Vlast;
-             if (firstind == 2 && j == 2)
-               {
-                 BB.UpdateVertex( Vlast, ParsSeam(i)(j), SeamEdge, BRep_Tool::Tolerance(Vlast) );
-                 EPmap( SeamEdge ).Append( ParsSeam(i)(j) );
-                 EVmap( SeamEdge ).Append( Vlast );
-                 EWmap( SeamEdge ).Append( NonSeamWires(i) );
-                 break;
-               }
-           }
-         else
-           {
-             BRepAdaptor_Curve bcur( NewE );
-             gp_Pnt Point = bcur.Value( par );
-             NewV = BRepLib_MakeVertex( Point );
-             BB.UpdateVertex( NewV, par, NewE, 10.*Precision::Confusion() );
-           }
-         BB.UpdateVertex( NewV, ParsSeam(i)(j), SeamEdge, 10.*Precision::Confusion() );
-         NewE.Orientation( TopAbs_FORWARD );
-         BB.Add( NewE, PrevV.Oriented(TopAbs_FORWARD) );
-         BB.Add( NewE, NewV.Oriented(TopAbs_REVERSED) );
-
-         NewEdges.Append( NewE );
-         EPmap( SeamEdge ).Append( ParsSeam(i)(j) );
-         EVmap( SeamEdge ).Append( NewV );
-         EWmap( SeamEdge ).Append( NonSeamWires(i) );
-
-         prevpar = par;
-         PrevV = NewV;
-       }
-      //The last edge
-      TopoDS_Shape aLocalShape = anEdge.EmptyCopied();
-      NewE = TopoDS::Edge( aLocalShape );
-      //NewE = TopoDS::Edge( anEdge.EmptyCopied() );
-      par = LastPar;
-      if (Abs(prevpar-par) > Precision::Confusion())
-       {
-         BB.Range( NewE, prevpar, par );
-         NewE.Orientation( TopAbs_FORWARD );
-         BB.Add( NewE, PrevV.Oriented(TopAbs_FORWARD) );
-         BB.Add( NewE, Vlast.Oriented(TopAbs_REVERSED) );
-         NewEdges.Append( NewE );
-       }
-
-      //Substitute anEdge by NewEdges
-      aSub.Substitute( anEdge, NewEdges );
-    }
-  
-  //Sorting of EPmap and EVmap and removing repeating points from them
-  iter.Initialize( EPmap );
-  for (; iter.More(); iter.Next())
-    {
-      TColStd_SequenceOfReal Seq;
-      Seq = iter.Value();
-      TopTools_SequenceOfShape SeqShape;
-      SeqShape = EVmap( iter.Key() );
-      TopTools_SequenceOfShape SeqShape2;
-      SeqShape2 = EWmap( iter.Key() );
-      for (i = 1; i < Seq.Length(); i++)
-      for (j = i+1; j <= Seq.Length(); j++)
-       if (Seq(j) < Seq(i))
-         {
-           Standard_Real temp = Seq(i);
-           Seq(i) = Seq(j);
-           Seq(j) = temp;
-           TopoDS_Shape tmp = SeqShape(i);
-           SeqShape(i) = SeqShape(j);
-           SeqShape(j) = tmp;
-           tmp = SeqShape2(i);
-           SeqShape2(i) = SeqShape2(j);
-           SeqShape2(j) = tmp;
-         }
-      EPmap( iter.Key() ) = Seq;
-      EVmap( iter.Key() ) = SeqShape;
-      EWmap( iter.Key() ) = SeqShape2;
-    }
-  iter.Initialize( EPmap );
-  for (; iter.More(); iter.Next())
+void BRepOffsetAPI_DraftAngle::CorrectVertexTol()
+{
+  TopTools_MapOfShape anInitVertices, anInitEdges, aNewEdges;
+  TopExp_Explorer anExp(myInitialShape, TopAbs_EDGE);
+  for(; anExp.More(); anExp.Next())
+  {
+    anInitEdges.Add(anExp.Current());
+    TopoDS_Iterator anIter(anExp.Current());
+    for(; anIter.More(); anIter.Next())
     {
-      TColStd_SequenceOfReal Seq;
-      Seq = iter.Value();
-      TopTools_SequenceOfShape SeqShape;
-      SeqShape = EVmap( iter.Key() );
-      TopTools_SequenceOfShape SeqShape2;
-      SeqShape2 = EWmap( iter.Key() );
-      Standard_Boolean remove = Standard_True;
-      while (remove)
-       {
-         remove = Standard_False;
-         for (i = 1; i < Seq.Length(); i++)
-           if (Abs(Seq(i)-Seq(i+1)) <= Precision::Confusion())
-             {
-               Seq.Remove(i+1);
-               SeqShape.Remove(i+1);
-               SeqShape2.Remove(i+1);
-               remove = Standard_True;
-             }
-       }
-      EPmap( iter.Key() ) = Seq;
-      EVmap( iter.Key() ) = SeqShape;
-      EWmap( iter.Key() ) = SeqShape2;
+      anInitVertices.Add(anIter.Value());
     }
-
-  //Reconstruction of seam edges
-  TopTools_DataMapOfShapeShape VEmap;
-  iter.Initialize( Emap );
-  for (; iter.More(); iter.Next())
+  }
+  //
+
+  BRep_Builder aBB;
+  myVtxToReplace.Clear();
+  anExp.Init(myShape, TopAbs_EDGE);
+  for(; anExp.More(); anExp.Next())
+  {
+    const TopoDS_Shape& anE = anExp.Current();
+    //Skip old (not modified) edges
+    if(anInitEdges.Contains(anE))
+      continue;
+    //
+    //Skip processed edges
+    if(aNewEdges.Contains(anE))
+      continue;
+    //
+    aNewEdges.Add(anE);
+    //
+    Standard_Real anETol = BRep_Tool::Tolerance(TopoDS::Edge(anE));
+    TopoDS_Iterator anIter(anE);
+    for(; anIter.More(); anIter.Next())
     {
-      TopoDS_Edge anEdge = TopoDS::Edge( iter.Key() );
-      Standard_Boolean onepoint = Standard_False;
-      TopTools_ListOfShape NewEdges;
-      TColStd_SequenceOfReal Seq;
-      Seq = iter.Value();
-      TColStd_SequenceOfReal Seq2;
-      Seq2 = EPmap( anEdge );
-      TopTools_SequenceOfShape SeqVer;
-      SeqVer = EVmap( anEdge );
-      TopTools_SequenceOfShape SeqWire;
-      SeqWire = EWmap( anEdge );
-      TopoDS_Vertex Vfirst, Vlast;
-      TopExp::Vertices( anEdge, Vfirst, Vlast );
-      Standard_Real fpar, lpar, FirstPar, LastPar;
-      BRep_Tool::Range( anEdge, FirstPar, LastPar );
-      fpar = FirstPar;
-      lpar = Seq(1);
-      TopoDS_Edge NewE;
-      Standard_Integer firstind = 1;
-      if (Abs(fpar-lpar) <= Precision::Confusion())
-       {
-         firstind = 2;
-         fpar = Seq(1);
-         lpar = Seq(2);
-       }
+      const TopoDS_Vertex& aVtx = TopoDS::Vertex(anIter.Value());
+      if(anInitVertices.Contains(aVtx))
+      {
+        if(myVtxToReplace.IsBound(aVtx))
+        {
+          aBB.UpdateVertex(TopoDS::Vertex(myVtxToReplace(aVtx)), anETol + Epsilon(anETol));
+        }
+        else
+        {
+          Standard_Real aVTol = BRep_Tool::Tolerance(aVtx);
+          if(aVTol < anETol)
+          {
+            TopoDS_Vertex aNewVtx;
+            gp_Pnt aVPnt = BRep_Tool::Pnt(aVtx);
+            aBB.MakeVertex(aNewVtx, aVPnt,anETol + Epsilon(anETol));
+            myVtxToReplace.Bind(aVtx, aNewVtx);
+          }
+        }
+      }
       else
-       {
-         if (Seq.Length()%2 != 0)
-           {
-             VEmap.Bind( Vfirst, anEdge );
-             firstind = 2;
-             fpar = Seq(1);
-             if (Seq.Length() > 2)
-               lpar = Seq(2);
-             else
-               onepoint = Standard_True;
-           }
-       }
-      if (!onepoint)
-       {
-         TopoDS_Shape aLocalShape = anEdge.EmptyCopied();
-         NewE = TopoDS::Edge( aLocalShape );
-         //NewE = TopoDS::Edge( anEdge.EmptyCopied() );
-         BB.Range( NewE, fpar, lpar );
-         NewE.Orientation( TopAbs_FORWARD );
-         if (firstind == 1)
-           {
-             BB.Add( NewE, Vfirst.Oriented(TopAbs_FORWARD) );
-             aLocalShape = SeqVer(1).Oriented(TopAbs_REVERSED);
-             BB.Add( NewE, TopoDS::Vertex( aLocalShape ) );
-             //BB.Add( NewE, TopoDS::Vertex( SeqVer(1).Oriented(TopAbs_REVERSED) ) );
-           }
-         else
-           {
-             aLocalShape = SeqVer(1).Oriented(TopAbs_FORWARD);
-             BB.Add( NewE, TopoDS::Vertex( aLocalShape ) );
-             aLocalShape = SeqVer(2).Oriented(TopAbs_REVERSED);
-             BB.Add( NewE, TopoDS::Vertex( aLocalShape ) );
-             //BB.Add( NewE, TopoDS::Vertex( SeqVer(1).Oriented(TopAbs_FORWARD) ) );
-             //BB.Add( NewE, TopoDS::Vertex( SeqVer(2).Oriented(TopAbs_REVERSED) ) );
-           }
-         NewEdges.Append( NewE );
-         
-         firstind++;
-         for (i = firstind; i < Seq.Length(); i += 2)
-           {
-             aLocalShape = anEdge.EmptyCopied();
-             NewE = TopoDS::Edge( aLocalShape );
-             //NewE = TopoDS::Edge( anEdge.EmptyCopied() );
-             fpar = Seq(i);
-             lpar = Seq(i+1);
-             BB.Range( NewE, fpar, lpar );
-             //Find vertices
-             for (j = 1; j <= Seq2.Length(); j++)
-               if (Abs(fpar-Seq2(j)) <= Precision::Confusion())
-                 break;
-             NewE.Orientation( TopAbs_FORWARD );
-             TopoDS_Shape aLocalShapeCur = SeqVer(j).Oriented(TopAbs_FORWARD);
-             BB.Add( NewE, TopoDS::Vertex( aLocalShapeCur) );
-             aLocalShapeCur = SeqVer(j+1).Oriented(TopAbs_REVERSED);
-             BB.Add( NewE, TopoDS::Vertex( aLocalShapeCur ) );
-             //BB.Add( NewE, TopoDS::Vertex( SeqVer(j).Oriented(TopAbs_FORWARD) ) );
-             //BB.Add( NewE, TopoDS::Vertex( SeqVer(j+1).Oriented(TopAbs_REVERSED) ) );
-             NewEdges.Append( NewE );
-           }
-       }
-
-      i = Seq.Length();
-      fpar = Seq(i);
-      lpar = LastPar;
-      if (Abs(fpar-lpar) <= Precision::Confusion())
-       continue;
-      TopoDS_Shape aLocalShape = anEdge.EmptyCopied();
-      NewE = TopoDS::Edge( aLocalShape );
-      //NewE = TopoDS::Edge( anEdge.EmptyCopied() );
-      BB.Range( NewE, fpar, lpar );
-      NewE.Orientation( TopAbs_FORWARD );
-      aLocalShape = SeqVer(SeqVer.Length()).Oriented(TopAbs_FORWARD);
-      BB.Add( NewE, TopoDS::Vertex( aLocalShape ) );
-      //BB.Add( NewE, TopoDS::Vertex( SeqVer(SeqVer.Length()).Oriented(TopAbs_FORWARD) ) );
-      BB.Add( NewE, Vlast.Oriented(TopAbs_REVERSED) );
-      NewEdges.Append( NewE );
-
-      //Substitute anEdge by NewEdges
-      aSub.Substitute( anEdge, NewEdges );
-    }
-
-  //Removing edges connected with missing extremities of seam edges
-  TopTools_DataMapIteratorOfDataMapOfShapeShape itve( VEmap );
-  for (; itve.More(); itve.Next())
-    {
-      TopoDS_Shape V = itve.Key();
-      TopoDS_Shape E = itve.Value();
-      TopoDS_Shape W;
-      for (i = 1; i <= Eseq.Length(); i++)
-       if (E.IsSame( Eseq(i) ))
-         {
-           W = Wseq(i);
-           break;
-         }
-      TopoDS_Shape Etoremove;
-      eit.Initialize( W );
-      for (; eit.More(); eit.Next())
-       {
-         TopoDS_Edge CurE = TopoDS::Edge( eit.Value() );
-         if (CurE.IsSame( E ))
-           continue;
-         TopoDS_Vertex Vfirst, Vlast;
-         TopExp::Vertices( CurE, Vfirst, Vlast );
-         if (Vfirst.IsSame( V ) || Vlast.IsSame( V ))
-           {
-             Etoremove = CurE;
-             break;
-           }
-       }
-      if (! Etoremove.IsNull())
-       {
-         W.Free( Standard_True );
-         BB.Remove( W, Etoremove );
-       }
+      {
+        aBB.UpdateVertex(aVtx, anETol + Epsilon(anETol));
+      }
     }
-
+  }
+  //
+  if(myVtxToReplace.IsEmpty())
+  {
+    return;
+  }
+  //
+  BRepTools_Substitution aSub;
+  TopTools_DataMapIteratorOfDataMapOfShapeShape anIter(myVtxToReplace);
+  for(; anIter.More(); anIter.Next())
+  {
+    TopTools_ListOfShape aSubVtx;
+    aSubVtx.Append(anIter.Value());
+    aSub.Substitute(anIter.Key(), aSubVtx);
+  }
   aSub.Build( myShape );
   if (aSub.IsCopied( myShape ))
-    {
-      const TopTools_ListOfShape& listSh = aSub.Copy( myShape );
-      if (! listSh.IsEmpty())
-       myShape = listSh.First();
-    }
-
-  //Reconstruction of wires
-  TopTools_ListOfShape theCopy;
-  TopTools_DataMapIteratorOfDataMapOfShapeListOfShape itww( WWmap );
-  for (; itww.More(); itww.Next())
-    {
-      CurWire = itww.Key();
-      theCopy = aSub.Copy( CurWire );
-      CurWire = theCopy.First();
-      CurWire.Free( Standard_True );
-      TopTools_ListIteratorOfListOfShape itl( itww.Value() );
-      for (; itl.More(); itl.Next())
-       {
-         TopoDS_Shape aWire = itl.Value();
-         CurFace = WFmap( aWire );
-         theCopy = aSub.Copy( aWire );
-         aWire = theCopy.First();
-         //Adjusting period
-         TopLoc_Location L;
-         Handle( Geom_Surface ) theSurf = BRep_Tool::Surface( TopoDS::Face(CurFace), L );
-         eit.Initialize( aWire );
-         for (; eit.More(); eit.Next())
-           {
-             TopoDS_Edge anEdge = TopoDS::Edge( eit.Value() );
-             gp_Pnt2d Pfirst, Plast, Pmid;
-             BRep_Tool::UVPoints( anEdge, TopoDS::Face(CurFace), Pfirst, Plast );
-             BRepAdaptor_Curve2d bc2d( anEdge, TopoDS::Face(CurFace) );
-             Pmid = bc2d.Value( (bc2d.FirstParameter()+bc2d.LastParameter())/2. );
-             gp_Vec2d offset;
-             Standard_Boolean translate = Standard_False;
-             if (Pfirst.X()-2.*M_PI > Precision::Confusion() ||
-                 Plast.X()-2.*M_PI > Precision::Confusion()  ||
-                 Pmid.X()-2.*M_PI > Precision::Confusion())
-               {
-                 offset.SetCoord( -2.*M_PI, 0 );
-                 translate = Standard_True;
-               }
-             if (Pfirst.X() < -Precision::Confusion() ||
-                 Plast.X() < -Precision::Confusion()  ||
-                 Pmid.X() < -Precision::Confusion())
-               {
-                 offset.SetCoord( 2.*M_PI, 0 );
-                 translate = Standard_True;
-               }
-             if (translate)
-               {
-                 const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &anEdge.TShape());
-                 BRep_ListIteratorOfListOfCurveRepresentation itcr( TE->ChangeCurves() );
-                 Handle(BRep_GCurve) GC;
-                 
-                 for (; itcr.More(); itcr.Next())
-                   {
-                     GC = Handle(BRep_GCurve)::DownCast(itcr.Value());
-                     if (!GC.IsNull() && GC->IsCurveOnSurface( theSurf, L ))
-                       {
-                         Handle(Geom2d_Curve) PC = GC->PCurve();
-                         PC = Handle(Geom2d_Curve)::DownCast( PC->Translated( offset ) );
-                         GC->PCurve( PC );
-                         TE->ChangeCurves().Remove( itcr );
-                         TE->ChangeCurves().Append( GC );
-                         break;
-                       }
-                   }
-               }
-           }
-         ///////////////////
-         eit.Initialize( aWire, Standard_False );
-         for (; eit.More(); eit.Next())
-           {
-             TopoDS_Shape anEdge = eit.Value();
-             BB.Add( CurWire, anEdge );
-           }
-         if (aSub.IsCopied( CurFace ))
-           {
-             theCopy = aSub.Copy( CurFace );
-             CurFace = theCopy.First();
-           }
-         CurFace.Free( Standard_True );
-         BB.Remove( CurFace, aWire );
-       }
-    }
+  {
+    const TopTools_ListOfShape& listSh = aSub.Copy( myShape );
+    if (! listSh.IsEmpty())
+      myShape = listSh.First();
+  }
+  //
 }
index 367770d..223596c 100644 (file)
@@ -22,6 +22,7 @@
 #include <Standard_Handle.hxx>
 
 #include <TopTools_ListOfShape.hxx>
+#include <TopTools_DataMapOfShapeShape.hxx>
 #include <BRepBuilderAPI_ModifyShape.hxx>
 #include <Standard_Real.hxx>
 #include <Standard_Boolean.hxx>
@@ -185,6 +186,14 @@ public:
   //! <S>.
   Standard_EXPORT virtual const TopTools_ListOfShape& Modified (const TopoDS_Shape& S) Standard_OVERRIDE;
 
+  //! Returns the modified shape corresponding to <S>.
+  //! S can correspond to the entire initial shape or to its subshape.
+  //! Raises exceptions
+  //! Standard_NoSuchObject if S is not the initial shape or
+  //! a subshape of the initial shape to which the
+  //! transformation has been applied. 
+  Standard_EXPORT virtual TopoDS_Shape ModifiedShape (const TopoDS_Shape& S) const Standard_OVERRIDE;
+
 
 
 
@@ -196,10 +205,9 @@ protected:
 
 private:
 
+  Standard_EXPORT void CorrectVertexTol();
 
-
-  TopTools_ListOfShape myModifiedShapes;
-
+  TopTools_DataMapOfShapeShape myVtxToReplace;
 
 };
 
index 5d79aa0..85b3aa2 100644 (file)
 #include <TopoDS_Shape.hxx>
 #include <TopoDS_Vertex.hxx>
 #include <TopTools_ListIteratorOfListOfShape.hxx>
+#include <GeomLib_CheckCurveOnSurface.hxx>
+#include <BRepLib.hxx>
+//
+static Standard_Real EvalTol(const Handle(Geom_Curve)& C3d, 
+  const Handle(Geom2d_Curve) C2d, 
+  const Handle(Geom_Surface)& S,
+  const Standard_Real f,
+  const Standard_Real l)
+{
+  Standard_Real first = f, last = l;
+  //Set first, last to avoid ErrosStatus = 2 because of 
+  //too strong checking of limits in class CheckCurveOnSurface
+  //
+  if(!C3d->IsPeriodic())
+  {
+    first = Max(first, C3d->FirstParameter());
+    last = Min(last, C3d->LastParameter());
+  }
+  if(!C2d->IsPeriodic())
+  {
+    first = Max(first, C2d->FirstParameter());
+    last = Min(last, C2d->LastParameter());
+  }
+
+  GeomLib_CheckCurveOnSurface CT(C3d, S, first, last);
+  CT.Perform(C2d);
+  if(CT.IsDone())
+  {
+    return CT.MaxDistance();
+  }
+  else
+  {
+    if(CT.ErrorStatus() == 3 || (CT.ErrorStatus() == 2 &&
+      (C3d->IsPeriodic() || C2d->IsPeriodic())))
+    {
+      //Try to estimate by sample points
+      Standard_Integer nbint = 22;
+      Standard_Real dt = (last - first) / nbint;
+      dt = Max(dt, Precision::Confusion());
+      Standard_Real d, dmax = 0.;
+      gp_Pnt2d aP2d;
+      gp_Pnt aPC, aPS;
+      Standard_Integer cnt = 0; 
+      Standard_Real t = first;
+      for(; t <= last; t += dt)
+      {
+        cnt++;
+        C2d->D0(t, aP2d);
+        C3d->D0(t, aPC);
+        S->D0(aP2d.X(), aP2d.Y(), aPS);
+        d = aPS.SquareDistance(aPC);
+        if(d > dmax)
+        {
+          dmax = d;
+        }
+      }
+      if(cnt < nbint + 1)
+      {
+        t = last;
+        C2d->D0(t, aP2d);
+        C3d->D0(t, aPC);
+        S->D0(aP2d.X(), aP2d.Y(), aPS);
+        d = aPS.SquareDistance(aPC);
+        if(d > dmax)
+        {
+          dmax = d;
+        }
+      }
+
+      dmax = 1.2 * Sqrt(dmax);
+      return dmax;
+    }
+    else
+    {
+      return 0.;
+    }
+  }
+}
 
 //=======================================================================
 //function : Draft_Modification
 //purpose  : 
 //=======================================================================
 Draft_Modification::Draft_Modification (const TopoDS_Shape& S) :
-       myComp(Standard_False),myShape(S)
+myComp(Standard_False),myShape(S)
 {
   TopExp::MapShapesAndAncestors(myShape,TopAbs_EDGE,TopAbs_FACE,myEFMap);
 }
@@ -103,10 +181,10 @@ void Draft_Modification::Init(const TopoDS_Shape& S)
 //=======================================================================
 
 Standard_Boolean Draft_Modification::Add(const TopoDS_Face& F,
-                                        const gp_Dir& Direction,
-                                        const Standard_Real Angle,
-                                        const gp_Pln& NeutralPlane,
-                                        const Standard_Boolean Flag)
+  const gp_Dir& Direction,
+  const Standard_Real Angle,
+  const gp_Pln& NeutralPlane,
+  const Standard_Boolean Flag)
 {
   if (!badShape.IsNull()) {
     Standard_ConstructionError::Raise();
@@ -141,7 +219,7 @@ void Draft_Modification::Remove(const TopoDS_Face& F)
     if (myFMap.FindFromKey(theF).RootFace().IsSame(curFace)) {
       conneF.Append(theF);
       if (theF.IsSame(badShape)) {
-       badShape.Nullify();
+        badShape.Nullify();
       }
     }
   }
@@ -167,7 +245,7 @@ void Draft_Modification::Remove(const TopoDS_Face& F)
   {
     const TopoDS_Edge& theE = myEMap.FindKey(i);
     if (myEMap.FindFromKey(theE).RootFace().IsSame(curFace))
-       conneF.Append(theE);
+      conneF.Append(theE);
   }
   ltod.Initialize(conneF);
   while (ltod.More()) {
@@ -244,7 +322,7 @@ const TopTools_ListOfShape & Draft_Modification::ConnectedFaces(const TopoDS_Fac
   }
 
   return conneF;
-  
+
 
 }
 
@@ -270,7 +348,7 @@ const TopTools_ListOfShape & Draft_Modification::ModifiedFaces()
   }
 
   return conneF;
-  
+
 
 }
 
@@ -281,11 +359,11 @@ const TopTools_ListOfShape & Draft_Modification::ModifiedFaces()
 //=======================================================================
 
 Standard_Boolean Draft_Modification::NewSurface(const TopoDS_Face& F,
-                                               Handle(Geom_Surface)& S,
-                                               TopLoc_Location& L,
-                                               Standard_Real& Tol,
-                                               Standard_Boolean& RevWires,
-                                               Standard_Boolean& RevFace)
+  Handle(Geom_Surface)& S,
+  TopLoc_Location& L,
+  Standard_Real& Tol,
+  Standard_Boolean& RevWires,
+  Standard_Boolean& RevFace)
 {
   if (!IsDone()) {Standard_DomainError::Raise();}
 
@@ -305,7 +383,7 @@ Standard_Boolean Draft_Modification::NewSurface(const TopoDS_Face& F,
 
   return Standard_True;
 }
-                                               
+
 
 //=======================================================================
 //function : NewCurve
@@ -313,19 +391,19 @@ Standard_Boolean Draft_Modification::NewSurface(const TopoDS_Face& F,
 //=======================================================================
 
 Standard_Boolean Draft_Modification::NewCurve(const TopoDS_Edge& E,
-                                             Handle(Geom_Curve)& C,
-                                             TopLoc_Location& L, 
-                                             Standard_Real& Tol)
+  Handle(Geom_Curve)& C,
+  TopLoc_Location& L, 
+  Standard_Real& Tol)
 {
   if (!IsDone()) {Standard_DomainError::Raise();}
 
   if (!myEMap.Contains(E)) 
     return Standard_False;
-  
+
   const Draft_EdgeInfo& Einf= myEMap.FindFromKey(E);
   if (!myEMap.FindFromKey(E).NewGeometry())
     return Standard_False;
-  
+
   Tol = Einf.Tolerance();
   Tol = Max(Tol, BRep_Tool::Tolerance(E));
   L.Identity();
@@ -342,8 +420,8 @@ Standard_Boolean Draft_Modification::NewCurve(const TopoDS_Edge& E,
 //=======================================================================
 
 Standard_Boolean Draft_Modification::NewPoint(const TopoDS_Vertex& V,
-                                             gp_Pnt& P, 
-                                             Standard_Real& Tol)
+  gp_Pnt& P, 
+  Standard_Real& Tol)
 {
   if (!IsDone()) {Standard_DomainError::Raise();};
 
@@ -363,24 +441,26 @@ Standard_Boolean Draft_Modification::NewPoint(const TopoDS_Vertex& V,
 //=======================================================================
 
 Standard_Boolean Draft_Modification::NewCurve2d(const TopoDS_Edge& E, 
-                                               const TopoDS_Face& F, 
-                                               const TopoDS_Edge& NewE, 
-                                               const TopoDS_Face&, 
-                                               Handle(Geom2d_Curve)& C,
-                                               Standard_Real& Tol)
+  const TopoDS_Face& F, 
+  const TopoDS_Edge& NewE, 
+  const TopoDS_Face&, 
+  Handle(Geom2d_Curve)& C,
+  Standard_Real& Tol)
 {
-  
+
   if (!IsDone()) {Standard_DomainError::Raise();};
 
   if (!myEMap.Contains(E)) {
     return Standard_False;
   }
-  
+
   Standard_Real Fp,Lp;
   BRep_Tool::Range(NewE,Fp,Lp);
-  
+
   Handle(Geom_Surface) SB = myFMap.FindFromKey(F).Geometry();
 
+  Tol = BRep_Tool::Tolerance(E);
+
   const Draft_EdgeInfo& Einf = myEMap.FindFromKey(E);
   if ( Einf.FirstFace().IsSame(F) && !Einf.FirstPC().IsNull()) {
     C = Einf.FirstPC();
@@ -389,21 +469,19 @@ Standard_Boolean Draft_Modification::NewCurve2d(const TopoDS_Edge& E,
     C = Einf.SecondPC();
   }
   else {
-    
+
     if (!myEMap.FindFromKey(E).NewGeometry()) {
       Standard_Real Fpi,Lpi;
       BRep_Tool::Range(E,Fpi,Lpi);
       if (Fpi <= Fp && Fp <= Lpi && Fpi <= Lp && Lp <= Lpi) {
-       return Standard_False;
+        return Standard_False;
       }
     }
-    
-    Tol = BRep_Tool::Tolerance(E);
-    
+
     //  if (!BRep_Tool::IsClosed(E,F)) {
     BRep_Tool::Range(NewE,Fp,Lp);
     Handle(Geom_TrimmedCurve) TC = new Geom_TrimmedCurve(myEMap.FindFromKey(E).Geometry(),
-                                                        Fp,Lp);
+      Fp,Lp);
     Fp = TC->FirstParameter();
     Lp = TC->LastParameter();
     BRep_Builder B;
@@ -426,9 +504,9 @@ Standard_Boolean Draft_Modification::NewCurve2d(const TopoDS_Edge& E,
   }
 
   JeRecadre = JeRecadre || 
-              (typs == STANDARD_TYPE(Geom_CylindricalSurface)) || 
-              (typs == STANDARD_TYPE(Geom_SphericalSurface)) || 
-             (typs == STANDARD_TYPE(Geom_ConicalSurface));
+    (typs == STANDARD_TYPE(Geom_CylindricalSurface)) || 
+    (typs == STANDARD_TYPE(Geom_SphericalSurface)) || 
+    (typs == STANDARD_TYPE(Geom_ConicalSurface));
 
   if ( JeRecadre) {
     Standard_Boolean bTranslate;
@@ -459,6 +537,15 @@ Standard_Boolean Draft_Modification::NewCurve2d(const TopoDS_Edge& E,
       C->Translate(aV2DT);
     }
   }
+  //
+  Handle(Geom_Curve) aC3d = BRep_Tool::Curve(NewE, Fp, Lp);
+  Standard_Real newtol = EvalTol(aC3d, C, SB, Fp, Lp);
+  if(newtol > Tol)
+  {
+    Tol = newtol;
+    BRep_Builder B;
+    B.UpdateEdge(NewE, newtol);
+  }
   return Standard_True;
 }
 
@@ -469,9 +556,9 @@ Standard_Boolean Draft_Modification::NewCurve2d(const TopoDS_Edge& E,
 //=======================================================================
 
 Standard_Boolean Draft_Modification::NewParameter(const TopoDS_Vertex& V,
-                                                 const TopoDS_Edge& E,
-                                                 Standard_Real& P,
-                                                 Standard_Real& Tol)
+  const TopoDS_Edge& E,
+  Standard_Real& P,
+  Standard_Real& Tol)
 {
 
   if (!IsDone()) {Standard_DomainError::Raise();};
@@ -502,24 +589,24 @@ Standard_Boolean Draft_Modification::NewParameter(const TopoDS_Vertex& V,
     Standard_Real FirstPar = GC->FirstParameter(), LastPar = GC->LastParameter();
     Standard_Real pconf = Precision::PConfusion();
     if (Abs( paramf - LastPar ) <= pconf)
-      {
-       paramf = FirstPar;
-       FV.Orientation(E.Orientation());
-       if (V.IsEqual( FV ))
-         P = paramf;
-      }
+    {
+      paramf = FirstPar;
+      FV.Orientation(E.Orientation());
+      if (V.IsEqual( FV ))
+        P = paramf;
+    }
 
     FV.Orientation(E.Orientation());
     if (!V.IsEqual(FV) && P <= paramf) {
       if (GC->IsPeriodic()) {
-       P += GC->Period();
+        P += GC->Period();
       }
       else {
-       P = GC->LastParameter();
+        P = GC->LastParameter();
       }
     }
   }
-  
+
   Tol = Max (BRep_Tool::Tolerance(V), BRep_Tool::Tolerance(E));
   return Standard_True;
 }
@@ -532,13 +619,13 @@ Standard_Boolean Draft_Modification::NewParameter(const TopoDS_Vertex& V,
 //=======================================================================
 
 GeomAbs_Shape Draft_Modification::Continuity(const TopoDS_Edge& E,
-                                            const TopoDS_Face& F1,
-                                            const TopoDS_Face& F2,
-                                            const TopoDS_Edge&,
-                                            const TopoDS_Face&,
-                                            const TopoDS_Face&)
+  const TopoDS_Face& F1,
+  const TopoDS_Face& F2,
+  const TopoDS_Edge&,
+  const TopoDS_Face&,
+  const TopoDS_Face&)
 {
   return BRep_Tool::Continuity(E,F1,F2);
 }
-                                            
+
 
index 9dc10d8..1aec745 100644 (file)
@@ -1508,6 +1508,7 @@ void Draft_Modification::Perform ()
 
       for (Vinf.InitEdgeIterator();Vinf.MoreEdge(); Vinf.NextEdge()) {
         const TopoDS_Edge& Edg = Vinf.Edge();
+        Standard_Real initpar = Vinf.Parameter(Edg);
         //const Draft_EdgeInfo& Einf = myEMap(Edg);
         Draft_EdgeInfo& Einf = myEMap.ChangeFromKey(Edg);
         //Vinf.ChangeParameter(Edg) = Parameter(Einf.Geometry(),pvt);
@@ -1520,7 +1521,19 @@ void Draft_Modification::Perform ()
           Vinf.ChangeParameter(Edg) = SmartParameter( Einf, BRep_Tool::Tolerance(Edg), pvt, done, S1, S2 );
         }
         else
+        {
+          if(Abs(initpar - param) > Precision::PConfusion())
+          {
+            Standard_Real f, l;
+            TopLoc_Location Loc;
+            const Handle(Geom_Curve)& aC = BRep_Tool::Curve(Edg, Loc, f, l);
+            if(aC->DynamicType() == STANDARD_TYPE(Geom_TrimmedCurve))
+            {
+              Einf.SetNewGeometry(Standard_True);
+            }
+          }
           Vinf.ChangeParameter(Edg) = param;
+        }
       }
     }
   }
diff --git a/tests/bugs/modalg_6/bug26426 b/tests/bugs/modalg_6/bug26426
new file mode 100644 (file)
index 0000000..fa333e6
--- /dev/null
@@ -0,0 +1,32 @@
+puts "========"
+puts "OCC26426"
+puts "========"
+puts ""
+################################################################################################################
+# Draft angle algorithm modifies input argument + the result of the operation have very large tolerance values
+################################################################################################################
+
+restore [locate_data_file OCC26426-prism_shape.brep] b
+
+set bug_info_0 [tolerance b]
+set bug_info_0 [lindex $bug_info_0 1]
+set bug_info_0 [string trim [string range $bug_info_0 [expr {[string first "=" $bug_info_0] + 1}] [expr {[string length $bug_info_0] - 1}]]]
+
+explode b f
+depouille r b 0 0 -1 b_1 -10 0 0 -40 0 0 1
+
+set bug_info_1 [tolerance b]
+set bug_info_1 [lindex $bug_info_1 1]
+set bug_info_1 [string trim [string range $bug_info_1 [expr {[string first "=" $bug_info_1] + 1}] [expr {[string length $bug_info_1] - 1}]]]
+
+set bug_info_2 [tolerance r]
+set bug_info_2 [lindex $bug_info_2 1]
+set bug_info_2 [string trim [string range $bug_info_2 [expr {[string first "=" $bug_info_2] + 1}] [expr {[string length $bug_info_2] - 1}]]]
+
+if {$bug_info_0 < $bug_info_1} {
+  puts "ERROR: OCC26426 is reproduced. Tolerance has been increased (case 1)."
+}
+
+if {[expr {$bug_info_0 + 0.0000001}] < $bug_info_2} {
+  puts "ERROR: OCC26426 is reproduced. Tolerance has been increased (case 2)."
+}
index bb32173..c6579f4 100755 (executable)
@@ -1,5 +1,7 @@
 #E6----------------------------------------------
-puts "TODO OCC22803 ALL: Faulty shapes in variables faulty_1 to faulty_"
+#puts "TODO OCC22803 ALL: Faulty shapes in variables faulty_1 to faulty_"
+puts "TODO OCC26426 ALL: Error: The tolerance of the resulting shape is too big "
+
 
 ptorus pt 25 24 90
 profile pr o 20 18 5  p 0 -1 0 1 0 0 l 10 t 0 30 \
index 068e4c6..7ce428e 100644 (file)
@@ -1,5 +1,5 @@
 #C5----------------------------------------------
-puts "TODO OCC22803 All:Faulty shapes in variables faulty_1 to faulty_6"
+puts "TODO OCC22803 All:Faulty shapes in variables faulty_1 to faulty_"
 
 plane ps 10 -3 0  1 0 0  0 .2 1
 psphere ps ps 20
index 7d5a335..5c88573 100644 (file)
@@ -1,5 +1,5 @@
 #D3---------------------------------------------
-puts "TODO OCC22803 All:Faulty shapes in variables faulty_1 to faulty_6"
+puts "TODO OCC22803 All:Faulty shapes in variables faulty_1 to faulty_"
 puts "TODO OCC22803 Linux Windows: Error : The area of the resulting shape is"
 
 plane pt 0 0 0 1 0 0
index d9d52c5..887cc08 100644 (file)
@@ -1,8 +1,9 @@
 # Original bug : pro12877
 # Date : 02 Dec 98
 
-puts "TODO OCC22803 All: Error: The tolerance of the resulting shape is too big"
+#puts "TODO OCC22803 All: Error: The tolerance of the resulting shape is too big"
 #puts "TODO OCC23511 Linux: The area of the resulting shape is 186543"
+puts "TODO OCC26426 All: Faulty shapes in variables faulty_1 to faulty_"
 
 restore [locate_data_file CFE903_pro12ggx.rle] base
 
index 9b55646..993347f 100644 (file)
@@ -1,7 +1,7 @@
 # Original bug : pro16449
 # Date : 18 Dec 98
 
-puts "TODO OCC22803 All:Faulty shapes in variables faulty_1 to faulty_4"
+puts "TODO OCC22803 All:Faulty shapes in variables faulty_1 to faulty_"
 
 restore [locate_data_file CFE903_pro16gha.rle] base