0027909: Modeling Algorithms - Exception during offset computation
authorakaftasev <akaftasev@opencascade.com>
Tue, 12 May 2020 09:21:59 +0000 (12:21 +0300)
committerbugmaster <bugmaster@opencascade.com>
Wed, 8 Jul 2020 13:03:42 +0000 (16:03 +0300)
Added function ChFi3d::IsTangentFaces for more accurate definition of connection type.
Test cases have been changed according to the current behavior.

35 files changed:
src/BRepOffset/BRepOffset_Analyse.cxx
src/BRepOffset/BRepOffset_MakeOffset.cxx
src/ChFi3d/ChFi3d.cxx
src/ChFi3d/ChFi3d.hxx
src/ChFi3d/ChFi3d_Builder_0.cxx
src/ChFi3d/ChFi3d_Builder_0.hxx
src/ChFi3d/ChFi3d_Builder_1.cxx
src/ChFi3d/ChFi3d_Builder_2.cxx
src/ChFi3d/ChFi3d_Builder_C1.cxx
src/ChFi3d/ChFi3d_Builder_CnCrn.cxx
tests/bugs/modalg_7/bug27908
tests/bugs/modalg_7/bug27909
tests/bugs/modalg_7/bug27910
tests/bugs/modalg_7/bug27911
tests/bugs/modalg_7/bug27912
tests/bugs/modalg_7/bug27913 [new file with mode: 0644]
tests/offset/with_intersect_20/L3
tests/offset/with_intersect_20/L9
tests/offset/with_intersect_20/M9
tests/offset/with_intersect_80/J9
tests/offset/with_intersect_80/K1
tests/offset/with_intersect_80/K8
tests/offset/with_intersect_80/L1
tests/offset/with_intersect_80/L4
tests/offset/with_intersect_80/L6
tests/offset/with_intersect_80/L8
tests/offset/with_intersect_80/M1
tests/offset/with_intersect_80/M3
tests/offset/with_intersect_80/M5
tests/offset/with_intersect_80/M6
tests/offset/with_intersect_80/M8
tests/offset/with_intersect_80/M9
tests/offset/with_intersect_80/N1
tests/perf/modalg/bug26443_1
tests/perf/modalg/bug26443_2

index 1eeb367..20bfba9 100644 (file)
@@ -89,28 +89,37 @@ static void EdgeAnalyse(const TopoDS_Edge&         E,
                                          const Standard_Real        SinTol,
                                                BRepOffset_ListOfInterval& LI)
 {
-  
   Standard_Real   f,l;
   BRep_Tool::Range(E, F1, f, l);
   BRepOffset_Interval I;
   I.First(f); I.Last(l);
-  //
-  // Tangent if the regularity is at least G1.
-  if (BRep_Tool::HasContinuity(E,F1,F2)) {
-    if (BRep_Tool::Continuity(E,F1,F2) > GeomAbs_C0) {
-      I.Type(ChFiDS_Tangential);
-      LI.Append(I);
-      return;
-    }
+  //  
+  BRepAdaptor_Surface aBAsurf1(F1, Standard_False);
+  GeomAbs_SurfaceType aSurfType1 = aBAsurf1.GetType();
+
+  BRepAdaptor_Surface aBAsurf2(F2, Standard_False);
+  GeomAbs_SurfaceType aSurfType2 = aBAsurf2.GetType();
+
+  Standard_Boolean isTwoPlanes = (aSurfType1 == GeomAbs_Plane && aSurfType2 == GeomAbs_Plane);
+
+  ChFiDS_TypeOfConcavity ConnectType = ChFiDS_Other;
+
+  if (isTwoPlanes) //then use only strong condition
+  {
+    if (BRep_Tool::Continuity(E,F1,F2) > GeomAbs_C0)
+      ConnectType = ChFiDS_Tangential;
+    else
+      ConnectType = ChFi3d::DefineConnectType(E, F1, F2, SinTol, Standard_False);
   }
-  //
-  ChFiDS_TypeOfConcavity aType = ChFi3d::DefineConnectType(E, F1, F2,
-                                                           SinTol, Standard_False);
-  if(aType != ChFiDS_Tangential)
+  else
   {
-    aType = ChFi3d::DefineConnectType(E, F1, F2, SinTol, Standard_True);
+    if (ChFi3d::IsTangentFaces(E, F1, F2)) //weak condition
+      ConnectType = ChFiDS_Tangential;
+    else
+      ConnectType = ChFi3d::DefineConnectType(E, F1, F2, SinTol, Standard_False);
   }
-  I.Type(aType);
+   
+  I.Type(ConnectType);
   LI.Append(I);
 }
 
index 201f0b7..89ad5c0 100644 (file)
@@ -4098,7 +4098,7 @@ void TrimEdge(TopoDS_Edge&                  NE,
         gp_Pnt thePoint = BRep_Tool::Pnt(V);
         GeomAPI_ProjectPointOnCurve Projector(thePoint, theCurve);
         if (Projector.NbPoints() == 0)
-          throw Standard_ConstructionError("BRepOffset_MakeOffset::TrimEdge no projection");
+          return;
         U = Projector.LowerDistanceParameter();
       }
       if (U < UMin) {
index b5720c5..a557965 100644 (file)
 #include <TopoDS_Edge.hxx>
 #include <BRepTools.hxx>
 #include <IntTools_Tools.hxx>
+#include <BRepAdaptor_HSurface.hxx>
+#include <BRepTopAdaptor_TopolTool.hxx>
+#include <LocalAnalysis_SurfaceContinuity.hxx>
+#include <TopOpeBRepTool_TOOL.hxx>
+
 
 static void Correct2dPoint(const TopoDS_Face& theF, gp_Pnt2d& theP2d);
 //
@@ -101,7 +106,6 @@ ChFiDS_TypeOfConcavity ChFi3d::DefineConnectType(const TopoDS_Edge&     E,
 
   gp_Vec        ProVec     = DN1^DN2;
   Standard_Real NormProVec = ProVec.Magnitude(); 
-
   if (NormProVec < SinTol) {
     // plane
     if (DN1.Dot(DN2) > 0) {   
@@ -132,6 +136,95 @@ ChFiDS_TypeOfConcavity ChFi3d::DefineConnectType(const TopoDS_Edge&     E,
 }
 
 //=======================================================================
+//function : IsTangentFaces
+//purpose  : 
+//=======================================================================
+Standard_Boolean ChFi3d::IsTangentFaces(const TopoDS_Edge& theEdge,
+                                        const TopoDS_Face& theFace1,
+                                        const TopoDS_Face& theFace2,
+                                        const GeomAbs_Shape Order)
+{
+  if (Order == GeomAbs_G1 && BRep_Tool::Continuity(theEdge, theFace1, theFace2) != GeomAbs_C0)
+    return Standard_True;
+
+  Standard_Real TolC0 = Max(0.001, 1.5*BRep_Tool::Tolerance(theEdge));
+
+  Standard_Real aFirst;
+  Standard_Real aLast;
+
+  // Obtaining of pcurves of edge on two faces.
+  const Handle(Geom2d_Curve) aC2d1 = BRep_Tool::CurveOnSurface
+    (theEdge, theFace1, aFirst, aLast);
+  //For the case of seam edge
+  TopoDS_Edge EE = theEdge;
+  if (theFace1.IsSame(theFace2))
+    EE.Reverse();
+  const Handle(Geom2d_Curve) aC2d2 = BRep_Tool::CurveOnSurface
+    (EE, theFace2, aFirst, aLast);
+  if (aC2d1.IsNull() || aC2d2.IsNull())
+    return Standard_False;
+
+  // Obtaining of two surfaces from adjacent faces.
+  Handle(Geom_Surface) aSurf1 = BRep_Tool::Surface(theFace1);
+  Handle(Geom_Surface) aSurf2 = BRep_Tool::Surface(theFace2);
+
+  if (aSurf1.IsNull() || aSurf2.IsNull())
+    return Standard_False;
+
+  // Computation of the number of samples on the edge.
+  BRepAdaptor_Surface              aBAS1(theFace1);
+  BRepAdaptor_Surface              aBAS2(theFace2);
+  Handle(BRepAdaptor_HSurface)     aBAHS1 = new BRepAdaptor_HSurface(aBAS1);
+  Handle(BRepAdaptor_HSurface)     aBAHS2 = new BRepAdaptor_HSurface(aBAS2);
+  Handle(BRepTopAdaptor_TopolTool) aTool1 = new BRepTopAdaptor_TopolTool(aBAHS1);
+  Handle(BRepTopAdaptor_TopolTool) aTool2 = new BRepTopAdaptor_TopolTool(aBAHS2);
+  Standard_Integer                 aNbSamples1 = aTool1->NbSamples();
+  Standard_Integer                 aNbSamples2 = aTool2->NbSamples();
+  Standard_Integer                 aNbSamples = Max(aNbSamples1, aNbSamples2);
+
+  // Computation of the continuity.
+  Standard_Real    aPar;
+  Standard_Real    aDelta = (aLast - aFirst) / (aNbSamples - 1);
+  Standard_Integer i, nbNotDone = 0;
+
+  for (i = 1, aPar = aFirst; i <= aNbSamples; i++, aPar += aDelta) {
+    if (i == aNbSamples) aPar = aLast;
+
+    LocalAnalysis_SurfaceContinuity aCont(aC2d1, aC2d2, aPar,
+      aSurf1, aSurf2, Order,
+      0.001, TolC0, 0.1, 0.1, 0.1);
+    if (!aCont.IsDone())
+    {
+      nbNotDone++;
+      continue;
+    }
+
+    if (Order == GeomAbs_G1)
+    {
+      if (!aCont.IsG1())
+        return Standard_False;
+    }
+    else if (!aCont.IsG2())
+      return Standard_False;
+  }
+
+  if (nbNotDone == aNbSamples)
+    return Standard_False;
+
+  //Compare normals of tangent faces in the middle point
+  Standard_Real MidPar = (aFirst + aLast) / 2.;
+  gp_Pnt2d uv1 = aC2d1->Value(MidPar);
+  gp_Pnt2d uv2 = aC2d2->Value(MidPar);
+  gp_Dir normal1, normal2;
+  TopOpeBRepTool_TOOL::Nt(uv1, theFace1, normal1);
+  TopOpeBRepTool_TOOL::Nt(uv2, theFace2, normal2);
+  Standard_Real dot = normal1.Dot(normal2);
+  if (dot < 0.)
+    return Standard_False;
+  return Standard_True;
+}
+
+//=======================================================================
 //function : ConcaveSide
 //purpose  : calculate the concave face at the neighborhood of the border of
 //           2 faces.
index 4bf70d6..38c523f 100644 (file)
@@ -25,6 +25,7 @@
 #include <TopAbs_Orientation.hxx>
 #include <Standard_Boolean.hxx>
 #include <ChFiDS_TypeOfConcavity.hxx>
+#include <GeomAbs_Shape.hxx>
 class BRepAdaptor_Surface;
 class TopoDS_Edge;
 class TopoDS_Face;
@@ -47,7 +48,13 @@ public:
                                                                    const TopoDS_Face&     F2,
                                                                    const Standard_Real    SinTol,
                                                                    const Standard_Boolean CorrectPoint);
-  
+
+  //! Returns true if theEdge between theFace1 and theFace2 is tangent
+  Standard_EXPORT static Standard_Boolean IsTangentFaces (const TopoDS_Edge& theEdge,
+                                                          const TopoDS_Face& theFace1,
+                                                          const TopoDS_Face& theFace2,
+                                                          const GeomAbs_Shape Order = GeomAbs_G1);
+
   //! Returns  Reversed  in  Or1  and(or)  Or2  if
   //! the  concave edge  defined by the  interior of faces F1 and F2,
   //! in  the  neighbourhood of  their boundary E is of the edge opposite to  the
index a86bef8..de2ff45 100644 (file)
@@ -4594,93 +4594,6 @@ void ChFi3d_ChercheBordsLibres(const  ChFiDS_Map & myVEMap,
   }
 }
 
-Standard_Boolean ChFi3d_isTangentFaces(const TopoDS_Edge &theEdge,
-                                       const TopoDS_Face &theFace1,
-                                       const TopoDS_Face &theFace2,
-                                       const GeomAbs_Shape Order)
-{
-  if (Order == GeomAbs_G1 &&
-      BRep_Tool::Continuity( theEdge, theFace1, theFace2 ) != GeomAbs_C0)
-    return Standard_True;
-
-  Standard_Real TolC0 = Max(0.001, 1.5*BRep_Tool::Tolerance(theEdge));
-
-  Standard_Real aFirst;
-  Standard_Real aLast;
-    
-// Obtaining of pcurves of edge on two faces.
-  const Handle(Geom2d_Curve) aC2d1 = BRep_Tool::CurveOnSurface
-                                                (theEdge, theFace1, aFirst, aLast);
-  //For the case of seam edge
-  TopoDS_Edge EE = theEdge;
-  if (theFace1.IsSame(theFace2))
-    EE.Reverse();
-  const Handle(Geom2d_Curve) aC2d2 = BRep_Tool::CurveOnSurface
-                                                (EE, theFace2, aFirst, aLast);
-  if (aC2d1.IsNull() || aC2d2.IsNull())
-    return Standard_False;
-
-// Obtaining of two surfaces from adjacent faces.
-  Handle(Geom_Surface) aSurf1 = BRep_Tool::Surface(theFace1);
-  Handle(Geom_Surface) aSurf2 = BRep_Tool::Surface(theFace2);
-
-  if (aSurf1.IsNull() || aSurf2.IsNull())
-    return Standard_False;
-
-// Computation of the number of samples on the edge.
-  BRepAdaptor_Surface              aBAS1(theFace1);
-  BRepAdaptor_Surface              aBAS2(theFace2);
-  Handle(BRepAdaptor_HSurface)     aBAHS1      = new BRepAdaptor_HSurface(aBAS1);
-  Handle(BRepAdaptor_HSurface)     aBAHS2      = new BRepAdaptor_HSurface(aBAS2);
-  Handle(BRepTopAdaptor_TopolTool) aTool1      = new BRepTopAdaptor_TopolTool(aBAHS1);
-  Handle(BRepTopAdaptor_TopolTool) aTool2      = new BRepTopAdaptor_TopolTool(aBAHS2);
-  Standard_Integer                 aNbSamples1 =     aTool1->NbSamples();
-  Standard_Integer                 aNbSamples2 =     aTool2->NbSamples();
-  Standard_Integer                 aNbSamples  =     Max(aNbSamples1, aNbSamples2);
-
-
-// Computation of the continuity.
-  Standard_Real    aPar;
-  Standard_Real    aDelta = (aLast - aFirst)/(aNbSamples - 1);
-  Standard_Integer i, nbNotDone = 0;
-
-  for (i = 1, aPar = aFirst; i <= aNbSamples; i++, aPar += aDelta) {
-    if (i == aNbSamples) aPar = aLast;
-
-    LocalAnalysis_SurfaceContinuity aCont(aC2d1,  aC2d2,  aPar,
-                                         aSurf1, aSurf2, Order,
-                                         0.001, TolC0, 0.1, 0.1, 0.1);
-    if (!aCont.IsDone())
-      {
-       nbNotDone++;
-       continue;
-      }
-    
-    if (Order == GeomAbs_G1)
-    {
-      if (!aCont.IsG1())
-        return Standard_False;
-    }
-    else if (!aCont.IsG2())
-      return Standard_False;
-  }
-  
-  if (nbNotDone == aNbSamples)
-    return Standard_False;
-
-  //Compare normals of tangent faces in the middle point
-  Standard_Real MidPar = (aFirst + aLast)/2.;
-  gp_Pnt2d uv1 = aC2d1->Value(MidPar);
-  gp_Pnt2d uv2 = aC2d2->Value(MidPar);
-  gp_Dir normal1, normal2;
-  TopOpeBRepTool_TOOL::Nt( uv1, theFace1, normal1 );
-  TopOpeBRepTool_TOOL::Nt( uv2, theFace2, normal2 );
-  Standard_Real dot = normal1.Dot(normal2);
-  if (dot < 0.)
-    return Standard_False;
-  return Standard_True;
-}
-
 //=======================================================================
 //function : NbNotDegeneratedEdges
 //purpose  : calculate the number of non-degenerated edges of Map VEMap(Vtx)
@@ -4698,6 +4611,7 @@ Standard_Integer ChFi3d_NbNotDegeneratedEdges (const TopoDS_Vertex& Vtx,
   return nba;
 }
 
+
 //=======================================================================
 //function : NbSharpEdges
 //purpose  : calculate the number of sharp edges of Map VEMap(Vtx)
@@ -4716,7 +4630,7 @@ Standard_Integer ChFi3d_NbSharpEdges (const TopoDS_Vertex& Vtx,
     {
       TopoDS_Face F1, F2;
       ChFi3d_conexfaces(cur, F1, F2, EFMap);
-      if (!F2.IsNull() && ChFi3d_isTangentFaces(cur, F1, F2, GeomAbs_G2))
+      if (!F2.IsNull() && ChFi3d::IsTangentFaces(cur, F1, F2, GeomAbs_G2))
         nba--;
     }
   }
index 315b4ad..14a6fa6 100644 (file)
@@ -552,11 +552,6 @@ void ChFi3d_ChercheBordsLibres(const  ChFiDS_Map & myVEMap,
                                 TopoDS_Edge & edgelibre1,
                                 TopoDS_Edge & edgelibre2);
 
-Standard_Boolean ChFi3d_isTangentFaces(const TopoDS_Edge &theEdge,
-                                       const TopoDS_Face &theFace1,
-                                       const TopoDS_Face &theFace2,
-                                       const GeomAbs_Shape Order = GeomAbs_G1);
-
 Standard_Integer ChFi3d_NbNotDegeneratedEdges (const TopoDS_Vertex& Vtx,
                                      const ChFiDS_Map& VEMap);
 Standard_Integer ChFi3d_NumberOfEdges(const TopoDS_Vertex& Vtx,
index a1b00c5..dc71bc3 100644 (file)
@@ -591,7 +591,7 @@ Standard_Boolean ChFi3d_Builder::FaceTangency(const TopoDS_Edge& E0,
   if(Nbf < 2) return Standard_False;
 //  Modified by Sergey KHROMOV - Fri Dec 21 17:44:19 2001 Begin
 //if (BRep_Tool::Continuity(E1,F[0],F[1]) != GeomAbs_C0) {
-  if (ChFi3d_isTangentFaces(E1,F[0],F[1])) {
+  if (ChFi3d::IsTangentFaces(E1,F[0],F[1])) {
 //  Modified by Sergey KHROMOV - Fri Dec 21 17:44:21 2001 End
     return Standard_False;
   }
@@ -610,7 +610,7 @@ Standard_Boolean ChFi3d_Builder::FaceTangency(const TopoDS_Edge& E0,
       if(Nbf < 2) return Standard_False;
 //  Modified by Sergey KHROMOV - Tue Dec 18 18:10:40 2001 Begin
 //    if (BRep_Tool::Continuity(Ec,F[0],F[1]) < GeomAbs_G1) {
-      if (!ChFi3d_isTangentFaces(Ec,F[0],F[1])) {
+      if (!ChFi3d::IsTangentFaces(Ec,F[0],F[1])) {
 //  Modified by Sergey KHROMOV - Tue Dec 18 18:10:41 2001 End
        return Standard_False;
       }
@@ -736,7 +736,7 @@ void ChFi3d_Builder::PerformExtremity (const Handle(ChFiDS_Spine)& Spine)
           continue;
         TopoDS_Face F1, F2;
         ChFi3d_conexfaces(anEdge, F1, F2, myEFMap);
-        if (!F2.IsNull() && ChFi3d_isTangentFaces(anEdge, F1, F2, GeomAbs_G2)) //smooth edge
+        if (!F2.IsNull() && ChFi3d::IsTangentFaces(anEdge, F1, F2, GeomAbs_G2)) //smooth edge
         {
           if (!F1.IsSame(F2))
             NbG1Connections++;
@@ -853,7 +853,7 @@ Standard_Boolean ChFi3d_Builder::PerformElement(const Handle(ChFiDS_Spine)& Spin
   if(ff1.IsNull() || ff2.IsNull()) return 0;
 //  Modified by Sergey KHROMOV - Fri Dec 21 17:46:22 2001 End
 //if(BRep_Tool::Continuity(Ec,ff1,ff2) != GeomAbs_C0) return 0;
-  if (ChFi3d_isTangentFaces(Ec,ff1,ff2)) return 0;
+  if (ChFi3d::IsTangentFaces(Ec,ff1,ff2)) return 0;
 //  Modified by Sergey KHROMOV - Fri Dec 21 17:46:24 2001 Begin
 
   TopoDS_Face FirstFace = ff1;
index ee86f4d..0831132 100644 (file)
@@ -250,7 +250,7 @@ static Standard_Boolean BonVoisin(const gp_Pnt& Point,
 //  Modified by Sergey KHROMOV - Fri Dec 21 17:12:48 2001 Begin
 //         Standard_Boolean istg = 
 //           BRep_Tool::Continuity(ecur,ff,F) != GeomAbs_C0;
-           Standard_Boolean istg = ChFi3d_isTangentFaces(ecur,ff,F);
+           Standard_Boolean istg = ChFi3d::IsTangentFaces(ecur,ff,F);
 //  Modified by Sergey KHROMOV - Fri Dec 21 17:12:51 2001 End
            if((!issame || (issame && isreallyclosed)) && istg) {
              found = 1;
@@ -456,7 +456,7 @@ Standard_Boolean IsG1(const ChFiDS_Map&         TheMap,
       FVoi = TopoDS::Face(It.Value());
 //  Modified by Sergey KHROMOV - Fri Dec 21 17:09:32 2001 Begin
 //    if (BRep_Tool::Continuity(E,FRef,FVoi) != GeomAbs_C0) {
-      if (ChFi3d_isTangentFaces(E,FRef,FVoi)) {
+      if (ChFi3d::IsTangentFaces(E,FRef,FVoi)) {
 //  Modified by Sergey KHROMOV - Fri Dec 21 17:09:33 2001 End
        return Standard_True;
       }
@@ -476,7 +476,7 @@ Standard_Boolean IsG1(const ChFiDS_Map&         TheMap,
        FVoi = FRef;
 //  Modified by Sergey KHROMOV - Fri Dec 21 17:15:12 2001 Begin
 //     if (BRep_Tool::Continuity(E,FRef,FRef) >= GeomAbs_G1) {   
-       if (ChFi3d_isTangentFaces(E,FRef,FRef)) {
+       if (ChFi3d::IsTangentFaces(E,FRef,FRef)) {
 //  Modified by Sergey KHROMOV - Fri Dec 21 17:15:16 2001 End
          return Standard_True;
        }
index 369d4dc..85fce5c 100644 (file)
@@ -334,7 +334,7 @@ static Standard_Boolean IntersUpdateOnSame(Handle(GeomAdaptor_HSurface)& HGs,
   if ( Update(HBs,Hc3df,FIop,CPop,FprolUV,isFirst,c3dU) )
     return Standard_True;
 
-  if (!ChFi3d_isTangentFaces(Eprol,Fprol,Fop))
+  if (!ChFi3d::IsTangentFaces(Eprol,Fprol,Fop))
     return Standard_False;
 
   Handle(Geom2d_Curve) gpcprol = BRep_Tool::CurveOnSurface(Eprol,Fprol,uf,ul);
@@ -1639,14 +1639,14 @@ void ChFi3d_Builder::PerformIntersectionAtEnd(const Standard_Integer Index)
     ChFi3d_edge_common_faces(myEFMap(Eadj1),Fga,Fdr);
 //  Modified by Sergey KHROMOV - Fri Dec 21 17:57:32 2001 Begin
 //  reg1=BRep_Tool::Continuity(Eadj1,Fga,Fdr)!=GeomAbs_C0;
-    reg1 = ChFi3d_isTangentFaces(Eadj1,Fga,Fdr);
+    reg1 = ChFi3d::IsTangentFaces(Eadj1,Fga,Fdr);
 //  Modified by Sergey KHROMOV - Fri Dec 21 17:57:33 2001 End
     if (F2.IsSame(facecouture)) Eadj2=edgecouture;
     else ChFi3d_cherche_element(Vtx,EdgeSpine,F2,Eadj2,Vbid1);
     ChFi3d_edge_common_faces(myEFMap(Eadj2),Fga,Fdr);
 //  Modified by Sergey KHROMOV - Fri Dec 21 17:58:22 2001 Begin
 //  reg2=BRep_Tool::Continuity(Eadj2,Fga,Fdr)!=GeomAbs_C0;
-    reg2 = ChFi3d_isTangentFaces(Eadj2,Fga,Fdr);
+    reg2 = ChFi3d::IsTangentFaces(Eadj2,Fga,Fdr);
 //  Modified by Sergey KHROMOV - Fri Dec 21 17:58:24 2001 End
 
 // two faces common to the edge are found
@@ -2067,9 +2067,9 @@ void ChFi3d_Builder::PerformIntersectionAtEnd(const Standard_Integer Index)
       else if (nbarete==5) {
        //pro15368
 //  Modified by Sergey KHROMOV - Fri Dec 21 18:07:43 2001 End
-       Standard_Boolean isTangent0 = ChFi3d_isTangentFaces(Edge[0],F1,Face[0]);
-       Standard_Boolean isTangent1 = ChFi3d_isTangentFaces(Edge[1],Face[0],Face[1]);
-       Standard_Boolean isTangent2 = ChFi3d_isTangentFaces(Edge[2],Face[1],Face[2]);
+       Standard_Boolean isTangent0 = ChFi3d::IsTangentFaces(Edge[0],F1,Face[0]);
+       Standard_Boolean isTangent1 = ChFi3d::IsTangentFaces(Edge[1],Face[0],Face[1]);
+       Standard_Boolean isTangent2 = ChFi3d::IsTangentFaces(Edge[2],Face[1],Face[2]);
        if ((isTangent0 || isTangent2) && isTangent1) {
 //         GeomAbs_Shape cont0,cont1,cont2;
 //         cont0=BRep_Tool::Continuity(Edge[0],F1,Face[0]);
@@ -3970,7 +3970,7 @@ void ChFi3d_Builder::IntersectMoreCorner(const Standard_Integer Index)
     inters = Update(HBs,Hc3df,FiopArc,CPopArc,p2dbout,isfirst,wop);
 //  Modified by Sergey KHROMOV - Fri Dec 21 18:08:27 2001 Begin
 //  if(!inters && BRep_Tool::Continuity(Arcprol,Fv,Fop) != GeomAbs_C0){
-    if(!inters && ChFi3d_isTangentFaces(Arcprol,Fv,Fop)){
+    if(!inters && ChFi3d::IsTangentFaces(Arcprol,Fv,Fop)){
 //  Modified by Sergey KHROMOV - Fri Dec 21 18:08:29 2001 End
       // Arcprol is an edge of tangency, ultimate adjustment by an extrema curve/curve is attempted.
       Standard_Real ff,ll;
index 65a2de2..e8087c1 100644 (file)
 #include <TopOpeBRepDS_Transition.hxx>
 #include <TopTools_Array2OfShape.hxx>
 #include <TopTools_IndexedMapOfShape.hxx>
+#include <ChFi3d.hxx>
 
 // performances 
 #ifdef OCCT_DEBUG
@@ -1261,7 +1262,7 @@ void  ChFi3d_Builder::PerformMoreThreeCorner(const Standard_Integer Jndex,
 //  Modified by Sergey KHROMOV - Fri Dec 21 18:11:02 2001 Begin
 //     regul.SetValue(ic,BRep_Tool::Continuity(TopoDS::Edge(Evive.Value(ic)),F1,F2)
 //                  !=GeomAbs_C0); 
-       regul.SetValue(ic, ChFi3d_isTangentFaces(TopoDS::Edge(Evive.Value(ic)),F1,F2)); 
+       regul.SetValue(ic, ChFi3d::IsTangentFaces(TopoDS::Edge(Evive.Value(ic)),F1,F2)); 
 //  Modified by Sergey KHROMOV - Fri Dec 21 18:11:07 2001 End
       }
     }
index f3c760c..7edd32e 100644 (file)
@@ -1,7 +1,3 @@
-puts "TODO OCC27908 ALL: An exception was caught"
-puts "TODO OCC27908 ALL: \\*\\* Exception \\*\\*.*"
-puts "TODO OCC27908 ALL: TEST INCOMPLETE"
-
 puts "========"
 puts "OCC27908"
 puts "========"
@@ -14,5 +10,11 @@ restore [locate_data_file bug27908.brep] s
 
 offsetparameter 1e-7 p i
 offsetload s 10
-
 offsetperform result
+
+unifysamedom result_unif result
+
+checkshape result
+checkprops result -s 178976
+checknbshapes result -ref [lrange [nbshapes s] 8 19]
+checkview -display result_unif -2d -path ${imagedir}/${test_image}.png
index f676829..e0014d4 100644 (file)
@@ -1,7 +1,3 @@
-puts "TODO OCC27908 ALL: An exception was caught"
-puts "TODO OCC27908 ALL: \\*\\* Exception \\*\\*.*"
-puts "TODO OCC27908 ALL: TEST INCOMPLETE"
-
 puts "========"
 puts "OCC27909"
 puts "========"
@@ -14,5 +10,11 @@ restore [locate_data_file bug27909.brep] s
 
 offsetparameter 1e-7 p i
 offsetload s 10
-
 offsetperform result
+
+unifysamedom result_unif result
+
+checkshape result
+checkprops result -s 368904
+checknbshapes result -ref [lrange [nbshapes s] 8 19]
+checkview -display result_unif -2d -path ${imagedir}/${test_image}.png
index eb34394..788bbea 100644 (file)
@@ -1,4 +1,3 @@
-
 puts "========"
 puts "OCC27910"
 puts "========"
@@ -13,5 +12,10 @@ offsetparameter 1e-7 p i
 offsetload s 10
 offsetperform result
 
-checkshape result
+unifysamedom result_unif result
 
+
+checkshape result
+checkprops result -s 386834
+checknbshapes result -ref [lrange [nbshapes s] 8 19]
+checkview -display result_unif -2d -path ${imagedir}/${test_image}.png
index 1eb00c4..5ebf14e 100644 (file)
@@ -1,7 +1,3 @@
-puts "TODO OCC27911 ALL: An exception was caught"
-puts "TODO OCC27911 ALL: \\*\\* Exception \\*\\*.*"
-puts "TODO OCC27911 ALL: TEST INCOMPLETE"
-
 puts "========"
 puts "OCC27911"
 puts "========"
@@ -14,5 +10,11 @@ restore [locate_data_file bug27911.brep] s
 
 offsetparameter 1e-7 p i
 offsetload s 10
-
 offsetperform result
+
+unifysamedom result_unif result
+
+checkshape result
+checkprops result -s 109689
+checknbshapes result -ref [lrange [nbshapes s] 8 19]
+checkview -display result_unif -2d -path ${imagedir}/${test_image}.png
index 12c5b80..48124b1 100644 (file)
@@ -1,5 +1,3 @@
-puts "TODO OCC27912 ALL: Error : The area of result shape is"
-
 puts "========"
 puts "OCC27912"
 puts "========"
@@ -9,10 +7,15 @@ puts ""
 #######################################
 
 restore [locate_data_file bug27912.brep] s
-
-offsetparameter 1e-7 p i
+                
+ offsetparameter 1e-7 p i
 offsetload s 10
-
 offsetperform result
 
-checkprops result -s 0
\ No newline at end of file
+unifysamedom result_unif result
+
+checkshape result
+checkprops result -s 1.29197e+006
+checknbshapes result -ref [lrange [nbshapes s] 8 19]
+checkview -display result_unif -2d -path ${imagedir}/${test_image}.png
+
diff --git a/tests/bugs/modalg_7/bug27913 b/tests/bugs/modalg_7/bug27913
new file mode 100644 (file)
index 0000000..aca74b5
--- /dev/null
@@ -0,0 +1,20 @@
+puts "TODO OCC26577 All: Error :  is WRONG because number of EDGE entities in shape"
+puts "TODO OCC26577 All: Error :  is WRONG because number of SHELL entities in shape"
+
+
+puts "=============================================================="
+puts "0027913: Sharing between edges was lost after offset operation"
+puts "=============================================================="
+puts ""
+
+restore [locate_data_file bug27913.brep] s 
+offsetparameter 1e-7 p i
+offsetload s 10
+offsetperform result
+
+unifysamedom result_unif result
+
+checkshape result
+checkview -display result_unif -2d -path ${imagedir}/${test_image}.png
+
+checknbshapes result -ref [lrange [nbshapes s] 8 19]
\ No newline at end of file
index 65de2da..9e27a55 100644 (file)
@@ -1,6 +1,3 @@
-puts "TODO OCC26578 All: Error :  is WRONG because number of"
-puts "TODO OCC26578 All: Faulty shapes in variables faulty_1 to faulty_"
-
 restore [locate_data_file bug26663_test_offset_L3.brep] s
 OFFSETSHAPE ${off_param} {} ${calcul} ${type}
 checknbshapes result -ref [lrange [nbshapes s] 8 19]
index ffbaded..11472fd 100644 (file)
@@ -1,6 +1,3 @@
-puts "TODO OCC26578 All: Error :  is WRONG because number of"
-puts "TODO OCC26578 All: Faulty shapes in variables faulty_1 to faulty_"
-
 restore [locate_data_file bug26663_test_offset_L9.brep] s
 OFFSETSHAPE ${off_param} {} ${calcul} ${type}
 checknbshapes result -ref [lrange [nbshapes s] 8 19]
index ebb4a89..bfb7cdb 100644 (file)
@@ -1,4 +1,3 @@
-puts "TODO OCC26577 All: Error :  is WRONG because number of SHELL entities in shape"
 restore [locate_data_file bug26663_test_offset_M9.brep] s
 OFFSETSHAPE ${off_param} {} ${calcul} ${type}
 checknbshapes result -ref [lrange [nbshapes s] 8 19]
index bee5a06..55246c9 100644 (file)
@@ -1,3 +1,6 @@
+puts "TODO OCC26577 All: Error :  is WRONG because number of EDGE entities in shape"
+puts "TODO OCC26577 All: Error :  is WRONG because number of SHELL entities in shape"
 restore [locate_data_file bug26663_test_offset_J9.brep] s
 OFFSETSHAPE ${off_param} {} ${calcul} ${type}
+checknbshapes result -ref [lrange [nbshapes s] 8 19]
 
index 6425bfb..98781bb 100644 (file)
@@ -1,5 +1,3 @@
-puts "TODO OCC26577 All: Error :  is WRONG because number of EDGE entities in shape"
-puts "TODO OCC26577 All: Error :  is WRONG because number of SHELL entities in shape"
 restore [locate_data_file bug26663_test_offset_K1.brep] s
 OFFSETSHAPE ${off_param} {} ${calcul} ${type}
 checknbshapes result -ref [lrange [nbshapes s] 8 19]
index c7b86dc..c6a7d62 100644 (file)
@@ -1,6 +1,3 @@
-puts "TODO OCC26578 All:An exception was caught"
-puts "TODO OCC26578 All:\\*\\* Exception \\*\\*"
-puts "TODO OCC26578 All:TEST INCOMPLETE"
 restore [locate_data_file bug26663_test_offset_K8.brep] s
 OFFSETSHAPE ${off_param} {} ${calcul} ${type}
 checknbshapes result -ref [lrange [nbshapes s] 8 19]
index 78f0261..ca3136a 100644 (file)
@@ -1,6 +1,3 @@
-puts "TODO OCC26578 All:An exception was caught"
-puts "TODO OCC26578 All:\\*\\* Exception \\*\\*"
-puts "TODO OCC26578 All:TEST INCOMPLETE"
 restore [locate_data_file bug26663_test_offset_L1.brep] s
 OFFSETSHAPE ${off_param} {} ${calcul} ${type}
 checknbshapes result -ref [lrange [nbshapes s] 8 19]
index f62dda0..d8d4efb 100644 (file)
@@ -1,5 +1,3 @@
-puts "TODO OCC26577 All: Error :  is WRONG because number of EDGE entities in shape"
-puts "TODO OCC26577 All: Error :  is WRONG because number of SHELL entities in shape"
 restore [locate_data_file bug26663_test_offset_L4.brep] s
 OFFSETSHAPE ${off_param} {} ${calcul} ${type}
 checknbshapes result -ref [lrange [nbshapes s] 8 19]
index 96047e1..182c84d 100644 (file)
@@ -1,6 +1,6 @@
-puts "TODO OCC26577 All: Error :  is WRONG because number of EDGE entities in shape"
-puts "TODO OCC26577 All: Error :  is WRONG because number of SHELL entities in shape"
-puts "REQUIRED All: Faulty shapes in variables faulty_1 to faulty"
+#puts "TODO OCC26577 All: Error :  is WRONG because number of EDGE entities in shape"
+#puts "TODO OCC26577 All: Error :  is WRONG because number of SHELL entities in shape"
+#puts "REQUIRED All: Faulty shapes in variables faulty_1 to faulty"
 restore [locate_data_file bug26663_test_offset_L6.brep] s
 OFFSETSHAPE ${off_param} {} ${calcul} ${type}
 checknbshapes result -ref [lrange [nbshapes s] 8 19]
index 2b103ac..c5672c4 100644 (file)
@@ -1,5 +1,3 @@
-puts "TODO OCC26577 All: Error :  is WRONG because number of EDGE entities in shape"
-puts "TODO OCC26577 All: Error :  is WRONG because number of SHELL entities in shape"
 restore [locate_data_file bug26663_test_offset_L8.brep] s
 OFFSETSHAPE ${off_param} {} ${calcul} ${type}
 checknbshapes result -ref [lrange [nbshapes s] 8 19]
index d6139fb..ad7da29 100644 (file)
@@ -1,5 +1,3 @@
-puts "TODO OCC26577 All: Error :  is WRONG because number of EDGE entities in shape"
-puts "TODO OCC26577 All: Error :  is WRONG because number of SHELL entities in shape"
 restore [locate_data_file bug26663_test_offset_M1.brep] s
 OFFSETSHAPE ${off_param} {} ${calcul} ${type}
 checknbshapes result -ref [lrange [nbshapes s] 8 19]
index 16fd5ec..01ec4c6 100644 (file)
@@ -1,6 +1,3 @@
-puts "TODO OCC26578 All:An exception was caught"
-puts "TODO OCC26578 All:\\*\\* Exception \\*\\*"
-puts "TODO OCC26578 All:TEST INCOMPLETE"
 restore [locate_data_file bug26663_test_offset_M3.brep] s
 OFFSETSHAPE ${off_param} {} ${calcul} ${type}
 checknbshapes result -ref [lrange [nbshapes s] 8 19]
index 6451d39..29eeda6 100644 (file)
@@ -1,6 +1,3 @@
-puts "TODO OCC26578 All:An exception was caught"
-puts "TODO OCC26578 All:\\*\\* Exception \\*\\*"
-puts "TODO OCC26578 All:TEST INCOMPLETE"
 restore [locate_data_file bug26663_test_offset_M5.brep] s
 OFFSETSHAPE ${off_param} {} ${calcul} ${type}
 checknbshapes result -ref [lrange [nbshapes s] 8 19]
index ac0f0e3..7c775c2 100644 (file)
@@ -1,5 +1,3 @@
-puts "TODO OCC26577 All: Error :  is WRONG because number of EDGE entities in shape"
-puts "TODO OCC26577 All: Error :  is WRONG because number of SHELL entities in shape"
 restore [locate_data_file bug26663_test_offset_M6.brep] s
 OFFSETSHAPE ${off_param} {} ${calcul} ${type}
 checknbshapes result -ref [lrange [nbshapes s] 8 19]
index ae0cb00..eb6770d 100644 (file)
@@ -1,6 +1,3 @@
-puts "TODO OCC26578 All:An exception was caught"
-puts "TODO OCC26578 All:\\*\\* Exception \\*\\*"
-puts "TODO OCC26578 All:TEST INCOMPLETE"
 restore [locate_data_file bug26663_test_offset_M8.brep] s
 OFFSETSHAPE ${off_param} {} ${calcul} ${type}
 checknbshapes result -ref [lrange [nbshapes s] 8 19]
index ebb4a89..bfb7cdb 100644 (file)
@@ -1,4 +1,3 @@
-puts "TODO OCC26577 All: Error :  is WRONG because number of SHELL entities in shape"
 restore [locate_data_file bug26663_test_offset_M9.brep] s
 OFFSETSHAPE ${off_param} {} ${calcul} ${type}
 checknbshapes result -ref [lrange [nbshapes s] 8 19]
index 6ed19fb..f893d57 100644 (file)
@@ -1,6 +1,3 @@
-puts "TODO OCC26578 All: Error :  is WRONG because number of"
-puts "TODO OCC26578 All: Faulty shapes in variables faulty_1 to faulty_"
-
 restore [locate_data_file bug26663_test_offset_N1.brep] s
 OFFSETSHAPE ${off_param} {} ${calcul} ${type}
 checknbshapes result -ref [lrange [nbshapes s] 8 19]
index 975b746..66b34a3 100644 (file)
@@ -15,4 +15,6 @@ offsetshape r a -2
 dchrono h stop counter offsetshape
 fit
 
+checkshape r
+checknbshapes r -ref [lrange [nbshapes a] 8 19]
 checkview -screenshot -2d -path ${imagedir}/${test_image}.png
index d98d576..0e61afc 100644 (file)
@@ -15,4 +15,6 @@ offsetshape r a -2
 dchrono h stop counter offsetshape
 fit
 
+checkshape r
+checknbshapes r -ref [lrange [nbshapes a] 8 19]
 checkview -screenshot -2d -path ${imagedir}/${test_image}.png