]> OCCT Git - occt-copy.git/commitdiff
Patch for the issue #28373.
authornbv <nbv@opencascade.com>
Thu, 19 Jan 2017 07:48:09 +0000 (10:48 +0300)
committernbv <nbv@opencascade.com>
Fri, 20 Jan 2017 08:12:10 +0000 (11:12 +0300)
src/BRepClass/BRepClass_FaceExplorer.cxx
tests/boolean/bopfuse_complex/J6
tests/bugs/modalg_6/bug28373 [new file with mode: 0644]
tests/de/step_2/Y5
tests/offset/compshape/A1

index b5668bffbf84902124dbd31f1711f42130e313e6..a6de83d0a192f54de3a8fbb919ea2179d47bb9f4 100644 (file)
 #include <TopoDS.hxx>
 #include <BRep_Tool.hxx>
 
+static const Standard_Real Probing_Start = 0.123;
+static const Standard_Real Probing_End = 0.7;
+static const Standard_Real Probing_Step = 0.2111;
+
 //=======================================================================
 //function : BRepClass_FaceExplorer
 //purpose  : 
@@ -31,7 +35,7 @@
 BRepClass_FaceExplorer::BRepClass_FaceExplorer(const TopoDS_Face& F) :
        myFace(F),
        myCurEdgeInd(1),
-       myCurEdgePar(0.123)
+       myCurEdgePar(Probing_Start)
 {
   myFace.Orientation(TopAbs_FORWARD);
 }
@@ -56,7 +60,7 @@ Standard_Boolean BRepClass_FaceExplorer::Segment(const gp_Pnt2d& P,
                                                 Standard_Real& Par)
 {
   myCurEdgeInd = 1;
-  myCurEdgePar = 0.123;
+  myCurEdgePar = Probing_Start;
 
   return OtherSegment(P, L, Par);
 }
@@ -75,7 +79,7 @@ Standard_Boolean BRepClass_FaceExplorer::OtherSegment(const gp_Pnt2d& P,
   Standard_Real        aFPar;
   Standard_Real        aLPar;
   Handle(Geom2d_Curve) aC2d;
-  Standard_Real        aTolParConf = Precision::PConfusion();
+  Standard_Real        aTolParConf2 = Precision::PConfusion() * Precision::PConfusion();
   gp_Pnt2d             aPOnC;
   Standard_Real        aParamIn;
 
@@ -103,32 +107,51 @@ Standard_Boolean BRepClass_FaceExplorer::OtherSegment(const gp_Pnt2d& P,
        } else if (Precision::IsPositiveInfinite(aLPar))
          aLPar = aFPar + 1.;
 
-       for (; myCurEdgePar < 0.7 ;myCurEdgePar += 0.2111) {
+       for (; myCurEdgePar < Probing_End ;myCurEdgePar += Probing_Step) {
          aParamIn = myCurEdgePar*aFPar + (1. - myCurEdgePar)*aLPar;
 
-         aC2d->D0(aParamIn, aPOnC);
-         Par = aPOnC.Distance(P);
+          gp_Vec2d aTanVec;
+         aC2d->D1(aParamIn, aPOnC, aTanVec);
+         Par = aPOnC.SquareDistance(P);
 
-         if (Par > aTolParConf) {
+         if (Par > aTolParConf2) {
            gp_Vec2d aLinVec(P, aPOnC);
            gp_Dir2d aLinDir(aLinVec);
 
+            Standard_Real aTanMod = aTanVec.SquareMagnitude();
+            if (aTanMod < aTolParConf2)
+              continue;
+            aTanVec /= Sqrt(aTanMod);
+            Standard_Real aSinA = aTanVec.Crossed(aLinDir.XY());
+            const Standard_Real SmallAngle = 0.001;
+            if (Abs(aSinA) < SmallAngle)
+            {
+              // The line from the input point P to the current point on edge
+              // is tangent to the edge curve. This condition is bad for classification.
+              // Therefore try to go to another point in the hope that there will be 
+              // no tangent. If there tangent is preserved then leave the last point in 
+              // order to get this edge chanse to participate in classification.
+              if (myCurEdgePar + Probing_Step < Probing_End)
+                continue;
+            }
+
            L = gp_Lin2d(P, aLinDir);
 
            // Check if ends of a curve lie on a line.
            aC2d->D0(aFPar, aPOnC);
 
-           if (L.Distance(aPOnC) > aTolParConf) {
+           if (L.SquareDistance(aPOnC) > aTolParConf2) {
              aC2d->D0(aLPar, aPOnC);
 
-             if (L.Distance(aPOnC) > aTolParConf) {
-               myCurEdgePar += 0.2111;
+             if (L.SquareDistance(aPOnC) > aTolParConf2) {
+               myCurEdgePar += Probing_Step;
 
-               if (myCurEdgePar >= 0.7) {
+               if (myCurEdgePar >= Probing_End) {
                  myCurEdgeInd++;
-                 myCurEdgePar = 0.123;
+                 myCurEdgePar = Probing_Start;
                }
 
+               Par = Sqrt(Par);
                return Standard_True;
              }
            }
@@ -139,7 +162,7 @@ Standard_Boolean BRepClass_FaceExplorer::OtherSegment(const gp_Pnt2d& P,
 
     // This curve is not valid for line construction. Go to another edge.
     myCurEdgeInd++;
-    myCurEdgePar = 0.123;
+    myCurEdgePar = Probing_Start;
   }
 
   // nothing found, return an horizontal line
index 8c4120338aa8d08a11d86fe1d959d6ab4401534a..7e8946cb2d9b1c3715ccf8563168242abe6735ec 100644 (file)
@@ -1,4 +1,5 @@
 puts "TODO #22911 ALL: Error : The area of the resulting shape is"
+puts "TODO #22911 ALL: Faulty shapes in variables faulty_1 to"
 
 restore [locate_data_file a350] a
 restore [locate_data_file b350] b
diff --git a/tests/bugs/modalg_6/bug28373 b/tests/bugs/modalg_6/bug28373
new file mode 100644 (file)
index 0000000..681898c
--- /dev/null
@@ -0,0 +1,28 @@
+puts "========"
+puts "OCC28373"
+puts "========"
+puts ""
+#################################################
+# Incomplete section between cylinder and plane
+#################################################
+
+restore [locate_data_file bug28373_face.brep] f
+restore [locate_data_file bug28373_hole.brep] h
+
+bclearobjects
+bcleartools
+baddobjects f
+baddtools h
+bfillds
+bbop rs 4
+
+regexp {nb alone Vertices : ([-0-9.+eE]+)} [checksection rs] full nbv
+if { $nbv != 0 } { puts "Error : Section is incorrect" }
+
+bbop result 2
+
+checkshape result
+
+set square 5.47202
+set 2dviewer 1
+
index 94f7b4c6cd02bc8aaeca7efa03208c7769fd7ed9..045791f1ec4ed63ac78d33538e7d0a906b723094 100644 (file)
@@ -9,8 +9,8 @@ set ref_data {
 DATA        : Faulties = 0  ( 0 )  Warnings = 0  ( 0 )  Summary  = 0  ( 0 )
 TPSTAT      : Faulties = 0  ( 0 )  Warnings = 56  ( 42 )  Summary  = 56  ( 42 )
 CHECKSHAPE  : Wires    = 0  ( 0 )  Faces    = 0  ( 1 )  Shells   = 0  ( 0 )   Solids   = 0 ( 0 )
-NBSHAPES    : Solid    = 10  ( 10 )  Shell    = 12  ( 12 )  Face     = 269  ( 269 )   Summary  = 1654  ( 1642 )
-STATSHAPE   : Solid    = 10  ( 10 )  Shell    = 12  ( 12 )  Face     = 269  ( 269 )   FreeWire = 0  ( 0 )   FreeEdge  = 0 ( 0 )   SharedEdge = 648  ( 640 )
+NBSHAPES    : Solid    = 11  ( 11 )  Shell    = 13  ( 13 )  Face     = 270  ( 270 )   Summary  = 1660  ( 1646 )
+STATSHAPE   : Solid    = 11  ( 11 )  Shell    = 13  ( 13 )  Face     = 270  ( 270 )   FreeWire = 0  ( 0 )   FreeEdge  = 0 ( 0 )   SharedEdge = 648  ( 640 )
 TOLERANCE   : MaxTol   =  0.01008857123  (  0.01008857108 )  AvgTol   =  0.000308869925  (  0.0003243299963 )
 LABELS      : N0Labels = 3  ( 3 )  N1Labels = 2  ( 3 )  N2Labels = 0  ( 1 )   TotalLabels = 5  ( 7 )   NameLabels = 5  ( 5 )   ColorLabels = 0  ( 0 )   LayerLabels = 0  ( 0 )
 PROPS       : Centroid = 0  ( 0 )  Volume   = 0  ( 0 )  Area     = 0  ( 0 )
index b4ca5c06131bd667451ee1522eeca8b9d5e132c7..2a6fd4ae2972a3fea475994cda98080cb5034d4a 100644 (file)
@@ -9,5 +9,7 @@ explode s F
 offsetcompshape result s -10 s_1
 
 #real volume of result shape is unknow yet
-puts "TODO OFF22926 ALL: The offset is not valid"
+puts "?TODO OFF22926 ALL: The offset is not valid"
+puts "TODO OFF22926 ALL: Tcl Exception: result is not a topological shape!!!"
+
 set volume 0