0026185: BRepOffsetAPI_MakeOffset: regressions on some customer's cases
authorjgv <jgv@opencascade.com>
Thu, 28 May 2015 12:25:42 +0000 (15:25 +0300)
committerbugmaster <bugmaster@opencascade.com>
Thu, 28 May 2015 12:26:35 +0000 (15:26 +0300)
Minor correction.

Test-cases for issue #26185

Modifications in test-cases according to developer's notes

16 files changed:
src/BRepFill/BRepFill_OffsetWire.cxx
src/BRepFill/BRepFill_TrimEdgeTool.cdl
src/BRepFill/BRepFill_TrimEdgeTool.cxx
src/Bisector/Bisector_Bisec.cdl
src/Bisector/Bisector_Bisec.cxx
src/Bisector/Bisector_BisecAna.cdl
src/Bisector/Bisector_BisecAna.cxx
src/MAT2d/MAT2d_Tool2d.cxx
tests/bugs/modalg_5/bug25298_09
tests/bugs/modalg_6/bug26185_1 [new file with mode: 0644]
tests/bugs/modalg_6/bug26185_2 [new file with mode: 0644]
tests/bugs/modalg_6/bug26185_3 [new file with mode: 0644]
tests/bugs/modalg_6/bug26185_4 [new file with mode: 0644]
tests/bugs/modalg_6/bug26185_5 [new file with mode: 0644]
tests/bugs/modalg_6/bug26185_6 [new file with mode: 0644]
tests/bugs/modalg_6/bug26185_7 [new file with mode: 0644]

index 926c880..d26c261 100644 (file)
@@ -900,6 +900,9 @@ void BRepFill_OffsetWire::PerformWithBiLo
       //                                  MapNodeVertex,VE);
     }
 
+    if (myJoinType == GeomAbs_Intersection)
+      StartOnEdge = EndOnEdge = 0;
+
     //---------------------------------------------
     // Construction of geometries.
     //---------------------------------------------
@@ -912,7 +915,7 @@ void BRepFill_OffsetWire::PerformWithBiLo
     // Construction of vertices on edges parallel to the spine.
     //-----------------------------------------------------------
 
-    Trim.IntersectWith(E [0], E [1], Params);
+    Trim.IntersectWith(E [0], E [1], myJoinType, Params);
 
     for (Standard_Integer s = 1; s <= Params.Length(); s++) {
       TopoDS_Vertex VC;
index 491e6d9..0e8d174 100644 (file)
@@ -26,7 +26,8 @@ uses
     Curve         from Geom2d,
     Geometry      from Geom2d, 
     SequenceOfPnt from TColgp,
-    Curve         from Geom2dAdaptor
+    Curve         from Geom2dAdaptor,
+    JoinType      from GeomAbs
 
 is
     Create
@@ -39,6 +40,7 @@ is
     
     IntersectWith( me : in out;
                   Edge1 , Edge2 :        Edge          from TopoDS;
+                  theJoinType   :        JoinType      from GeomAbs;
                   Params        : in out SequenceOfPnt from TColgp)
     is static;
 
index 89d90ee..689b207 100644 (file)
@@ -303,8 +303,9 @@ static void EvalParametersBis(const Geom2dAdaptor_Curve& Bis,
 //=======================================================================
 
 void BRepFill_TrimEdgeTool::IntersectWith(const TopoDS_Edge& Edge1,
-  const TopoDS_Edge& Edge2,
-  TColgp_SequenceOfPnt& Params)
+                                          const TopoDS_Edge& Edge2,
+                                          const GeomAbs_JoinType theJoinType,
+                                          TColgp_SequenceOfPnt& Params)
 {
   Params.Clear();
 
@@ -554,6 +555,23 @@ void BRepFill_TrimEdgeTool::IntersectWith(const TopoDS_Edge& Edge1,
   }
 
   NbPoints = Params.Length();
+
+  if (NbPoints > 0 && theJoinType == GeomAbs_Intersection)
+  {
+    //Remove all vertices with non-minimal parameter
+    Standard_Integer imin = 1;
+    for (i = 2; i <= NbPoints; i++)
+      if (Params(i).X() < Params(imin).X())
+        imin = i;
+    gp_Pnt Pnt1 = Params(imin);
+    gp_Pnt Pnt2 = Points2(imin);
+    Params.Clear();
+    Points2.Clear();
+    Params.Append(Pnt1);
+    Points2.Append(Pnt2);
+  }
+  
+  NbPoints = Params.Length();
   for ( i = 1; i <= NbPoints; i++) {
     PSeq = Params(i);
     PSeq.SetZ((Points2.Value(i)).Y());
index 114526a..18a9970 100644 (file)
@@ -45,20 +45,22 @@ uses
     Point        from Geom2d  ,
     Pnt2d        from gp      ,
     Vec2d        from gp      ,
-    Integer      from Standard
+    Integer      from Standard,
+    JoinType     from GeomAbs
 
 is
     Create returns Bisec from Bisector;
 
     Perform(me        : in out                                 ;
-            Cu1       : Curve   from Geom2d                    ;
-            Cu2       : Curve   from Geom2d                    ;
-            P         : Pnt2d   from gp                        ;
-            V1        : Vec2d   from gp                        ;
-            V2        : Vec2d   from gp                        ;
-            Sense     : Real    from Standard                  ;
-           Tolerance : Real    from Standard                  ;
-           oncurve   : Boolean from Standard = Standard_True  );
+            Cu1       : Curve    from Geom2d                    ;
+            Cu2       : Curve    from Geom2d                    ;
+            P         : Pnt2d    from gp                        ;
+            V1        : Vec2d    from gp                        ;
+            V2        : Vec2d    from gp                        ;
+            Sense     : Real     from Standard                  ;
+           ajointype : JoinType from GeomAbs                   ;
+           Tolerance : Real     from Standard                  ;
+           oncurve   : Boolean  from Standard = Standard_True  );
           
        --- Purpose : Performs  the bisecting line  between the  curves
        --            <Cu1> and <Cu2>. 
index 6c45534..9262b91 100644 (file)
@@ -73,13 +73,14 @@ Bisector_Bisec::Bisector_Bisec()
 //===========================================================================
 
 void Bisector_Bisec::Perform(const Handle(Geom2d_Curve)& afirstcurve   ,
-  const Handle(Geom2d_Curve)& asecondcurve  ,
-  const gp_Pnt2d&             apoint        ,
-  const gp_Vec2d&             afirstvector  ,
-  const gp_Vec2d&             asecondvector ,
-  const Standard_Real         adirection    ,
-  const Standard_Real         tolerance     ,
-  const Standard_Boolean      oncurve       )
+                            const Handle(Geom2d_Curve)& asecondcurve  ,
+                            const gp_Pnt2d&             apoint        ,
+                            const gp_Vec2d&             afirstvector  ,
+                            const gp_Vec2d&             asecondvector ,
+                            const Standard_Real         adirection    ,
+                             const GeomAbs_JoinType      ajointype     ,
+                            const Standard_Real         tolerance     ,
+                            const Standard_Boolean      oncurve       )
 {
   Handle(Standard_Type)  Type1 = afirstcurve ->DynamicType();
   Handle(Standard_Type)  Type2 = asecondcurve->DynamicType();
@@ -149,18 +150,19 @@ void Bisector_Bisec::Perform(const Handle(Geom2d_Curve)& afirstcurve   ,
     //------------------------------------------------------------------
     // Analytic Bissectrice.
     //------------------------------------------------------------------
-    Handle(Bisector_BisecAna) BisAna = new Bisector_BisecAna();
-    BisAna->Perform(afirstcurve1   ,
-      asecondcurve1  ,
-      apoint        ,
-      afirstvector  ,
-      asecondvector ,
-      adirection    ,
-      tolerance     ,
-      oncurve       );
-    UFirst = BisAna->ParameterOfStartPoint();
-    ULast  = BisAna->ParameterOfEndPoint(); 
-    Bis = BisAna;   
+     Handle(Bisector_BisecAna) BisAna = new Bisector_BisecAna();
+     BisAna->Perform(afirstcurve1  ,
+                    asecondcurve1 ,
+                    apoint        ,
+                    afirstvector  ,
+                    asecondvector ,
+                    adirection    ,
+                     ajointype     ,
+                    tolerance     ,
+                    oncurve       );
+     UFirst = BisAna->ParameterOfStartPoint();
+     ULast  = BisAna->ParameterOfEndPoint();    
+     Bis = BisAna;   
   }
   else {  
     Standard_Boolean IsLine = Standard_False;
index db5248e..231e41c 100644 (file)
@@ -27,6 +27,7 @@ inherits
 uses
     Shape             from GeomAbs,
     CurveType         from GeomAbs,
+    JoinType          from GeomAbs,
     Curve             from Geom2d,
     Geometry          from Geom2d,    
     TrimmedCurve      from Geom2d,
@@ -43,14 +44,15 @@ is
     Create returns BisecAna;
     
     Perform(me        : mutable                                ;
-            Cu1       : Curve   from Geom2d                    ;
-            Cu2       : Curve   from Geom2d                    ;
-            P         : Pnt2d   from gp                        ;
-            V1        : Vec2d   from gp                        ;
-            V2        : Vec2d   from gp                        ;
-            Sense     : Real    from Standard                  ;
-           Tolerance : Real    from Standard                  ;
-           oncurve   : Boolean from Standard = Standard_True  );
+            Cu1       : Curve    from Geom2d                    ;
+            Cu2       : Curve    from Geom2d                    ;
+            P         : Pnt2d    from gp                        ;
+            V1        : Vec2d    from gp                        ;
+            V2        : Vec2d    from gp                        ;
+            Sense     : Real     from Standard                  ;
+           jointype  : JoinType from GeomAbs                  ;
+           Tolerance : Real     from Standard                  ;
+           oncurve   : Boolean  from Standard = Standard_True  );
           
        --- Purpose : Performs  the bisecting line  between the  curves
        --            <Cu1> and <Cu2>. 
@@ -125,7 +127,8 @@ is
              Sense :        Real    from Standard   ;
              U     :    out Real    from Standard   ;
             sense :    out Boolean from Standard   ;
-            ok    :    out Boolean from Standard   ) 
+            ok    :    out Boolean from Standard   ;
+            IsBisecOfTwoLines : Boolean from Standard = Standard_False)
         
         --- Purpose : Returns the distance between the point <P> and
         --            the bisecting <Bis>.
index ce42c1a..a5c05f0 100644 (file)
@@ -76,7 +76,8 @@ Standard_Real Bisector_BisecAna::Distance (
    const Standard_Real         adirection,
    Standard_Real&              aparameter,
    Standard_Boolean&           asense,
-   Standard_Boolean&           astatus)
+   Standard_Boolean&           astatus,
+   Standard_Boolean            IsBisecOfTwoLines)
 {
   astatus = Standard_True;
 
@@ -153,30 +154,36 @@ Standard_Real Bisector_BisecAna::Distance (
   else {
     asense = Standard_True;
 
-//  Modified by Sergey KHROMOV - Tue Oct 22 16:35:51 2002 Begin
-// Replacement of -1.E-8 for a tolerance 1.e-4
-    Standard_Real aTol = 1.e-4;
-
-    if ((afirstdir^secdirrev)*adirection < -0.1) {   // input
-      if((afirstdir^tangdir)*adirection < aTol &&
-        (secdirrev^tangdir)*adirection < aTol) asense = Standard_False;
-    }
-    else if((afirstdir^secdirrev)*adirection > 0.1) { // output
-      if((afirstdir^tangdir)*adirection < aTol ||
-        (secdirrev^tangdir)*adirection < aTol) asense = Standard_False;
-    }
-    else  {                                                // flat
-      if (afirstdir.Dot(secdirrev) > 0.) {                // tangent 
-       if ((afirstdir^tangdir)*adirection < 0.) asense = Standard_False;
+    if (!IsBisecOfTwoLines)
+    {
+      //  Modified by Sergey KHROMOV - Tue Oct 22 16:35:51 2002 Begin
+      // Replacement of -1.E-8 for a tolerance 1.e-4
+      Standard_Real aTol = 1.e-4;
+      
+      if ((afirstdir^secdirrev)*adirection < -0.1) {   // input
+        if((afirstdir^tangdir)*adirection < aTol &&
+           (secdirrev^tangdir)*adirection < aTol)
+          asense = Standard_False;
       }
-      else{                                                // turn back
-//  Modified by Sergey KHROMOV - Thu Oct 31 14:16:53 2002
-//     if ((afirstdir.Dot(tangdir))*adirection > 0.) asense = Standard_False;
-       if (afirstdir.Dot(tangdir) < 0.) asense = Standard_False;
-//  Modified by Sergey KHROMOV - Thu Oct 31 14:16:54 2002
+      else if((afirstdir^secdirrev)*adirection > 0.1) { // output
+        if((afirstdir^tangdir)*adirection < aTol ||
+           (secdirrev^tangdir)*adirection < aTol)
+          asense = Standard_False;
       }
+      else  {                                                // flat
+        if (afirstdir.Dot(secdirrev) > 0.) {                // tangent 
+          if ((afirstdir^tangdir)*adirection < 0.)
+            asense = Standard_False;
+        }
+        else{                                                // turn back
+          //  Modified by Sergey KHROMOV - Thu Oct 31 14:16:53 2002
+          //   if ((afirstdir.Dot(tangdir))*adirection > 0.) asense = Standard_False;
+          if (afirstdir.Dot(tangdir) < 0.) asense = Standard_False;
+          //  Modified by Sergey KHROMOV - Thu Oct 31 14:16:54 2002
+        }
+      }
+      //  Modified by Sergey KHROMOV - Tue Oct 22 16:35:51 2002 End
     }
-//  Modified by Sergey KHROMOV - Tue Oct 22 16:35:51 2002 End
   }
   return distance;
 }
@@ -198,6 +205,7 @@ void Bisector_BisecAna::Perform(const Handle(Geom2d_Curve)& afirstcurve   ,
                                const gp_Vec2d&             afirstvector  ,
                                const gp_Vec2d&             asecondvector ,
                                const Standard_Real         adirection    ,
+                                const GeomAbs_JoinType      ajointype     ,
                                const Standard_Real         tolerance     ,
                                const Standard_Boolean      oncurve       )
 {
@@ -625,14 +633,26 @@ void Bisector_BisecAna::Perform(const Handle(Geom2d_Curve)& afirstcurve   ,
        }
        else if (type == GccInt_Par) {
          bisectorcurve = new Geom2d_Parabola(TheSol->Parabola());
+          Standard_Real FocalLength = ((Handle(Geom2d_Parabola)&)bisectorcurve)->Focal();
+          Standard_Real secondparameter = Precision::Infinite();
          if (!thesense)
+          {
+            if (ajointype == GeomAbs_Intersection &&
+                4.*FocalLength < firstparameter) //first parameter is too far from peak of parabola
+              secondparameter = 0.;
            thebisector = new Geom2d_TrimmedCurve(bisectorcurve,
                                                  firstparameter,
-                                                 - Precision::Infinite());
+                                                 -secondparameter);
+          }
          else
+          {
+            if (ajointype == GeomAbs_Intersection &&
+                firstparameter < -4.*FocalLength) //first parameter is too far from peak of parabola
+              secondparameter = 0.;
            thebisector = new Geom2d_TrimmedCurve(bisectorcurve,
                                                  firstparameter,
-                                                 Precision::Infinite());
+                                                 secondparameter);
+          }
        }
       }
     }
@@ -714,7 +734,7 @@ void Bisector_BisecAna::Perform(const Handle(Geom2d_Curve)& afirstcurve   ,
       else
        distanceptsol = Distance(apoint,solution,
                                 afirstvector,asecondvector,
-                                adirection,parameter,sense,ok);
+                                adirection,parameter,sense,ok, Standard_True);
 //  Modified by skv - Tue Feb 15 17:51:29 2005 Integration End
       if (ok || !oncurve) {
        thesense = sense;
index 733b6a8..37dcb55 100644 (file)
@@ -351,12 +351,12 @@ void MAT2d_Tool2d::CreateBisector(const Handle(MAT_Bisector)& abisector)
 #endif
 
   if(type1 != STANDARD_TYPE(Geom2d_CartesianPoint) && 
-    type2 != STANDARD_TYPE(Geom2d_CartesianPoint)) {
-      bisector.Perform(item1,item2,
-        GeomPnt (abisector->IssuePoint()),
-        GeomVec (abisector->FirstVector()),
-        GeomVec (abisector->SecondVector()),
-        theDirection,tolerance,ontheline);
+     type2 != STANDARD_TYPE(Geom2d_CartesianPoint)) {
+    bisector.Perform(item1,item2,
+                    GeomPnt (abisector->IssuePoint()),
+                    GeomVec (abisector->FirstVector()),
+                    GeomVec (abisector->SecondVector()),
+                    theDirection,theJoinType,tolerance,ontheline);
   }
   else if(type1 == STANDARD_TYPE(Geom2d_CartesianPoint) && 
     type2 == STANDARD_TYPE(Geom2d_CartesianPoint)) {
@@ -721,10 +721,20 @@ Standard_Boolean MAT2d_Tool2d::IsSameDistance (
 
     Standard_Real EpsDist = MAT2d_TOLCONF*300. ;
     Distance = Dist(1);
-    for (Standard_Integer i = 1; i <= 4; i++){
     if (theJoinType == GeomAbs_Intersection &&
-        Precision::IsInfinite(Dist(i)))
-      continue;
+        Precision::IsInfinite(Distance))
+    {
+      for (Standard_Integer i = 2; i <= 4; i++)
+        if (!Precision::IsInfinite(Dist(i)))
+        {
+          Distance = Dist(i);
+          break;
+        }
+    }
+    for (Standard_Integer i = 1; i <= 4; i++){
+      if (theJoinType == GeomAbs_Intersection &&
+          Precision::IsInfinite(Dist(i)))
+        continue;
       if (Abs(Dist(i) - Distance) > EpsDist) {
         Distance = Precision::Infinite();
         return Standard_False;
@@ -1168,7 +1178,7 @@ void MAT2d_Tool2d::BisecFusion(const Standard_Integer I1,
     Handle(Bisector_BisecCC) BCC1 = Handle(Bisector_BisecCC)::DownCast(Bisector1->BasisCurve());
 
     Bis.Perform(BCC1->Curve(2), BCC1->Curve(1), P2, VBid, VBid, 
-      theDirection, Tolerance, Standard_False); 
+               theDirection, theJoinType, Tolerance, Standard_False); 
 
     Bisector1 = Handle(Geom2d_TrimmedCurve)::DownCast(Bis.Value());
     BCC1      = Handle(Bisector_BisecCC)   ::DownCast(Bisector1->BasisCurve());        
index f6897d0..a94e402 100755 (executable)
@@ -17,7 +17,7 @@ if [catch { mkoffset resoffset pp 1 -1. i } ] {
 } else {
   renamevar resoffset_1 result
 
-  set length 42
+  set length 39.5
 
   set nb_v_good 6
   set nb_e_good 7
diff --git a/tests/bugs/modalg_6/bug26185_1 b/tests/bugs/modalg_6/bug26185_1
new file mode 100644 (file)
index 0000000..375e528
--- /dev/null
@@ -0,0 +1,13 @@
+puts "========"
+puts "OCC26185"
+puts "========"
+puts ""
+##################################################################
+# BRepOffsetAPI_MakeOffset: regressions on some customer's cases
+##################################################################
+
+smallview
+restore [locate_data_file OCC26185_wrong2.brep] a
+openoffset res a 1 -5. i
+fit
+set only_screen_axo 1
diff --git a/tests/bugs/modalg_6/bug26185_2 b/tests/bugs/modalg_6/bug26185_2
new file mode 100644 (file)
index 0000000..536f425
--- /dev/null
@@ -0,0 +1,13 @@
+puts "========"
+puts "OCC26185"
+puts "========"
+puts ""
+##################################################################
+# BRepOffsetAPI_MakeOffset: regressions on some customer's cases
+##################################################################
+
+smallview
+restore [locate_data_file OCC26185_newOffset_1.brep] a
+openoffset res a 1 -0.6 i
+fit
+set only_screen_axo 1
diff --git a/tests/bugs/modalg_6/bug26185_3 b/tests/bugs/modalg_6/bug26185_3
new file mode 100644 (file)
index 0000000..b6ae309
--- /dev/null
@@ -0,0 +1,13 @@
+puts "========"
+puts "OCC26185"
+puts "========"
+puts ""
+##################################################################
+# BRepOffsetAPI_MakeOffset: regressions on some customer's cases
+##################################################################
+
+smallview
+restore [locate_data_file OCC26185_v6_Arcs.brep] a
+mkoffset res a 1 -5. i
+fit
+set only_screen_axo 1
diff --git a/tests/bugs/modalg_6/bug26185_4 b/tests/bugs/modalg_6/bug26185_4
new file mode 100644 (file)
index 0000000..f56886b
--- /dev/null
@@ -0,0 +1,14 @@
+puts "========"
+puts "OCC26185"
+puts "========"
+puts ""
+##################################################################
+# BRepOffsetAPI_MakeOffset: regressions on some customer's cases
+##################################################################
+
+smallview
+restore [locate_data_file OCC26185_wrong1.brep] a
+mkoffset res_1 a 1 -5. i
+mkoffset res_2 a 1 5. i
+fit
+set only_screen_axo 1
diff --git a/tests/bugs/modalg_6/bug26185_5 b/tests/bugs/modalg_6/bug26185_5
new file mode 100644 (file)
index 0000000..502b46f
--- /dev/null
@@ -0,0 +1,13 @@
+puts "========"
+puts "OCC26185"
+puts "========"
+puts ""
+##################################################################
+# BRepOffsetAPI_MakeOffset: regressions on some customer's cases
+##################################################################
+
+smallview
+restore [locate_data_file OCC26185_offsetcircles.brep] a
+mkoffset res a 2 -2. i
+fit
+set only_screen_axo 1
diff --git a/tests/bugs/modalg_6/bug26185_6 b/tests/bugs/modalg_6/bug26185_6
new file mode 100644 (file)
index 0000000..d441025
--- /dev/null
@@ -0,0 +1,13 @@
+puts "========"
+puts "OCC26185"
+puts "========"
+puts ""
+##################################################################
+# BRepOffsetAPI_MakeOffset: regressions on some customer's cases
+##################################################################
+
+smallview
+restore [locate_data_file OCC26185_linesSet.brep] a
+openoffset res a 10 2. i
+fit
+set only_screen_axo 1
diff --git a/tests/bugs/modalg_6/bug26185_7 b/tests/bugs/modalg_6/bug26185_7
new file mode 100644 (file)
index 0000000..3c13417
--- /dev/null
@@ -0,0 +1,14 @@
+puts "========"
+puts "OCC26185"
+puts "========"
+puts ""
+##################################################################
+# BRepOffsetAPI_MakeOffset: regressions on some customer's cases
+##################################################################
+
+smallview
+restore [locate_data_file OCC26185_v6_LineArc.brep] a
+mkoffset res_1 a 1 -5. i
+mkoffset res_2 a 1 5. i
+fit
+set only_screen_axo 1