]> OCCT Git - occt-copy.git/commitdiff
Patch for issue #26841
authornbv <nbv@opencascade.com>
Mon, 21 Dec 2015 10:30:00 +0000 (13:30 +0300)
committernbv <nbv@opencascade.com>
Mon, 21 Dec 2015 10:42:43 +0000 (13:42 +0300)
src/BOPTest/BOPTest_BOPCommands.cxx
src/IntTools/IntTools_FaceFace.cxx
tests/boolean/bsection/M3
tests/bugs/modalg_1/buc60462_2
tests/bugs/modalg_2/bug472_3
tests/bugs/modalg_6/bug26841_1 [new file with mode: 0644]
tests/bugs/modalg_6/bug26841_2 [new file with mode: 0644]

index cae3fabf597e13a74d72b6a1701fe5542ce978cd..9ca053c35e41d9450b1d0cbf27772e98a9d321f1 100644 (file)
@@ -54,6 +54,7 @@
 
 #include <BOPTest_DrawableShape.hxx>
 #include <BOPTest_Objects.hxx>
+#include <IntSurf_PntOn2S.hxx>
 
 //
 static BOPAlgo_PaveFiller* pPF=NULL;
@@ -115,7 +116,7 @@ static Standard_Integer mkvolume   (Draw_Interpretor&, Standard_Integer, const c
   theCommands.Add("bsection", "use bsection r s1 s2 [-n2d/-n2d1/-n2d2] [-na]", 
                                                       __FILE__, bsection, g);
   //
-  theCommands.Add("bopcurves", "use bopcurves F1 F2 [-2d/-2d1/-2d2]",
+  theCommands.Add("bopcurves", "use bopcurves F1 F2 [-2d/-2d1/-2d2] [-p u1 v1 u2 v2]",
                                                       __FILE__, bopcurves, g);
   theCommands.Add("bopnews"  , "use  bopnews -v[e,f]"      , __FILE__, bopnews, g);
   theCommands.Add("mkvolume", "make solids from set of shapes.\nmkvolume r b1 b2 ... [-c] [-ni]", 
@@ -645,29 +646,43 @@ Standard_Integer bopcurves (Draw_Interpretor& di,
   Standard_Boolean aToApproxC3d, aToApproxC2dOnS1, aToApproxC2dOnS2, anIsDone;
   Standard_Integer i, aNbCurves, aNbPoints;
   Standard_Real anAppTol, aTolR;
+  IntSurf_ListOfPntOn2S aListOfPnts;
   TCollection_AsciiString aNm("c_"), aNp("p_");
   //
   anAppTol = 0.0000001;
   aToApproxC3d = Standard_True;
   aToApproxC2dOnS1 = Standard_False;
   aToApproxC2dOnS2 = Standard_False;
+
   //
-  if (n > 3) {
-    if (!strcasecmp(a[3],"-2d")) {
+  for(Standard_Integer i = 3; i < n; i++)
+  {
+    if (!strcasecmp(a[i],"-2d")) {
       aToApproxC2dOnS1 = Standard_True;
       aToApproxC2dOnS2 = Standard_True;
     } 
-    else if (!strcasecmp(a[3],"-2d1")) {
+    else if (!strcasecmp(a[i],"-2d1")) {
       aToApproxC2dOnS1 = Standard_True;
     }
-    else if (!strcasecmp(a[3],"-2d2")) {
+    else if (!strcasecmp(a[i],"-2d2")) {
       aToApproxC2dOnS2 = Standard_True;
     }
+    else if (!strcasecmp(a[i],"-p")) {
+      IntSurf_PntOn2S aPt;
+      const Standard_Real aU1 = Draw::Atof(a[++i]);
+      const Standard_Real aV1 = Draw::Atof(a[++i]);
+      const Standard_Real aU2 = Draw::Atof(a[++i]);
+      const Standard_Real aV2 = Draw::Atof(a[++i]);
+
+      aPt.SetValue(aU1, aV1, aU2, aV2);
+      aListOfPnts.Append(aPt);
+    }
     else {
-      di << "Wrong key. To build 2d curves use: bopcurves F1 F2 -2d/-2d1/-2d2 \n";
+      di << "Wrong key. To build 2d curves use: bopcurves F1 F2 [-2d/-2d1/-2d2] [-p u1 v1 u2 v2]\n";
       return 1;
     }
   }
+
   //
   IntTools_FaceFace aFF;
   //
@@ -675,6 +690,7 @@ Standard_Integer bopcurves (Draw_Interpretor& di,
                      aToApproxC2dOnS1,
                      aToApproxC2dOnS2,
                      anAppTol);
+  aFF.SetList(aListOfPnts);
   //
   aFF.Perform (aF1, aF2);
   //
index ff86dfce3df3042f70328530fb09307e56246101..b3a1ba5134ab69b48cf80cb6cc4244589676f2ef 100644 (file)
@@ -153,7 +153,7 @@ static
                                 Standard_Real&      thevmin, 
                                 Standard_Real&      thevmax);
 
-static
+static 
   Standard_Boolean NotUseSurfacesForApprox
           (const TopoDS_Face& aF1,
            const TopoDS_Face& aF2,
@@ -195,7 +195,7 @@ static
 static 
   Standard_Boolean IsCurveValid(Handle(Geom2d_Curve)& thePCurve);
 
-static 
+static
   Standard_Boolean IsPointOnBoundary(const Standard_Real theParameter,
                                      const Standard_Real theFirstBoundary,
                                      const Standard_Real theSecondBoundary,
@@ -852,12 +852,12 @@ Standard_Real IntTools_FaceFace::ComputeTolerance()
       }
       //
       const TopoDS_Face& aF = !i ? myFace1 : myFace2;
-      aD = FindMaxDistance(aC3D, aFirst, aLast, aF, myContext);
+        aD = FindMaxDistance(aC3D, aFirst, aLast, aF, myContext);
       if (aD > aDMax) {
-        aDMax = aD;
+          aDMax = aD;
+        }
       }
     }
-  }
   //
   return aDMax;
 }
@@ -1033,6 +1033,8 @@ Standard_Real IntTools_FaceFace::ComputeTolerance()
            (aType2==GeomAbs_Plane && aType1==GeomAbs_SurfaceOfExtrusion) ||
            (aType1==GeomAbs_Plane && aType2==GeomAbs_BSplineSurface) ||
            (aType2==GeomAbs_Plane && aType1==GeomAbs_BSplineSurface) ||
+           (aType1==GeomAbs_Cylinder && aType2==GeomAbs_BSplineSurface) ||
+           (aType2==GeomAbs_Cylinder && aType1==GeomAbs_BSplineSurface)||
            !myApprox) {
     //
     Standard_Real aDMax;
@@ -1048,8 +1050,8 @@ Standard_Real IntTools_FaceFace::ComputeTolerance()
 //function : MakeCurve
 //purpose  : 
 //=======================================================================
-  void IntTools_FaceFace::MakeCurve(const Standard_Integer Index,
-                                    const Handle(Adaptor3d_TopolTool)& dom1,
+void IntTools_FaceFace::MakeCurve(const Standard_Integer Index,
+                                  const Handle(Adaptor3d_TopolTool)& dom1,
                                     const Handle(Adaptor3d_TopolTool)& dom2) 
 {
   Standard_Boolean bDone, rejectSurface, reApprox, bAvoidLineConstructor;
@@ -1088,13 +1090,31 @@ Standard_Real IntTools_FaceFace::ComputeTolerance()
       return;
     }
     L = anewL;
-    
+
     //const Handle(IntPatch_WLine)& aWLineX = Handle(IntPatch_WLine)::DownCast(L);
     //DumpWLine(aWLineX);
 
     //
     if(!myListOfPnts.IsEmpty()) {
-      bAvoidLineConstructor = Standard_True;
+      //char aBuff[10000];
+      //const IntSurf_PntOn2S& aPt = myListOfPnts.First();
+      //Standard_Real u1, v1, u2, v2;
+      //aPt.Parameters(u1, v1, u2, v2);
+
+      //Sprintf(aBuff,"bopcurves f1 f2 -2d");
+      //IntSurf_ListIteratorOfListOfPntOn2S IterLOP1(myListOfPnts);
+      //for(;IterLOP1.More(); IterLOP1.Next())
+      //{
+      //  const IntSurf_PntOn2S& aPt = IterLOP1.Value();
+      //  Standard_Real u1, v1, u2, v2;
+      //  aPt.Parameters(u1, v1, u2, v2);
+
+      //  Sprintf(aBuff, "%s -p %+10.20f %+10.20f %+10.20f %+10.20f", aBuff, u1, v1, u2, v2);
+      //}
+
+      //cout << aBuff << endl;
+
+      //bAvoidLineConstructor = Standard_True;
     }
 
     Standard_Integer nbp = aWLine->NbPnts();
@@ -1803,15 +1823,15 @@ Standard_Real IntTools_FaceFace::ComputeTolerance()
       //
       Standard_Real aReachedTol = Precision::Confusion();
       bIsDecomposited=DecompositionOfWLine(WL,
-                                           myHS1, 
-                                           myHS2, 
-                                           myFace1, 
-                                           myFace2, 
-                                           myLConstruct, 
-                                           bAvoidLineConstructor, 
-                                           aSeqOfL, 
-                                           aReachedTol,
-                                           myContext);
+                             myHS1, 
+                             myHS2, 
+                             myFace1, 
+                             myFace2, 
+                             myLConstruct, 
+                             bAvoidLineConstructor, 
+                             aSeqOfL, 
+                             aReachedTol,
+                             myContext);
       if ( bIsDecomposited && ( myTolReached3d < aReachedTol ) ) {
         myTolReached3d = aReachedTol;
       }
@@ -2739,7 +2759,7 @@ Handle(Geom2d_BSplineCurve) MakeBSpline2d(const Handle(IntPatch_WLine)& theWLine
 // because inside degenerated zone of the surface the approx. algo.
 // uses wrong values of normal, etc., and resulting curve will have
 // oscillations that we would not like to have. 
+
 
 
 static
@@ -3067,7 +3087,7 @@ Standard_Boolean FindPoint(const gp_Pnt2d&     theFirstPoint,
                            const Standard_Real theVmin,
                            const Standard_Real theVmax,
                            gp_Pnt2d&           theNewPoint) {
-  
+
   gp_Vec2d aVec(theFirstPoint, theLastPoint);
   Standard_Integer i = 0, j = 0;
 
index 08a3f95292957d92af4204793a45f8bff15c87ce..a25da78dcd6350ad552089004ab02deb957198ee 100644 (file)
@@ -1,5 +1,47 @@
 restore [locate_data_file GEN758_nofog.rle] a
-explode a
+explode a f
+
+# see issue #26777
+set GoodNbCurv 1
+
+set log [bopcurves a_1 a_2 -2d -p 0.20639206339545224 0.69260832843385300 0.0 0.017002507022347624]
+regexp {Tolerance Reached=+([-0-9.+eE]+)\n+([-0-9.+eE]+)} ${log} full Tolerance_Reached NbCurv
+
+set expected_Tolerance_Reached 0.00011474465750371152
+set tol_abs_Tolerance_Reached 0.0
+set tol_rel_Tolerance_Reached 1.0e-2
+checkreal "Tolerance Reached" ${Tolerance_Reached} ${expected_Tolerance_Reached} ${tol_abs_Tolerance_Reached} ${tol_rel_Tolerance_Reached}
+
+if {${NbCurv} != ${GoodNbCurv}} {
+  puts "Error: ${GoodNbCurv} curves are expected but ${NbCurv} are found!"
+}
+
+smallview
+clear
+
+if {${NbCurv} == 1} {
+  display c_1
+  fit
+} else {
+  for { set i 1 } { ${i} <= ${NbCurv} } {incr i} {
+    bounds c_$i u1 u2
+    cvalue c_$i u2 xx yy zz
+    point p$i xx yy zz
+  }
+  
+  fit
+  
+  for { set i 1 } { ${i} <= ${NbCurv} } {incr i} {
+    erase p$i
+    display c_$i
+  }
+}
+
+xwd ${imagedir}/${casename}_curv.png
+
+donly a_1 a_2
+
 bsection result a_1 a_2
 
 set length 22.2575
+checksection result
\ No newline at end of file
index bfe611097c22d563cc9a23c22cbfa7ec37a8e5de..5600525f17cf78b7e69d6033f1ed6626ecfffbf3 100755 (executable)
@@ -1,3 +1,5 @@
+puts "TODO OCC26717 ALL: Faulty shapes in variables faulty_1 to faulty_"
+
 puts "=========="
 puts "BUC60462"
 puts "=========="
@@ -13,4 +15,5 @@ puts "Fuse end"
 checkshape result r
 
 set square 94371.7
+checkshape result
 set 2dviewer 0
index db34c1aebe021b55f2226667b4a99a2ca8ed32aa..64b992077d9cc3f53dbd2a027140c5d9cc7d1cbd 100755 (executable)
@@ -1,3 +1,4 @@
+puts "TODO OCC25917 ALL: Faulty shapes in variables faulty_1 to faulty_"
 if { [regexp {Debug mode} [dversion]] } {
   puts "TODO OCC25917 ALL: TEST INCOMPLETE"
   puts "TODO OCC25917 ALL: Tcl Exception"
diff --git a/tests/bugs/modalg_6/bug26841_1 b/tests/bugs/modalg_6/bug26841_1
new file mode 100644 (file)
index 0000000..b149005
--- /dev/null
@@ -0,0 +1,50 @@
+puts "============"
+puts "OCC26841"
+puts "============"
+puts ""
+###############################
+## Wrong result obtained by intersection algorithm.
+###############################
+
+restore [locate_data_file bug26841c1-prism.brep] p1
+restore [locate_data_file bug26841c1-deck.brep] a1
+
+bsection result a1 p1 -n2d2
+
+smallview
+donly result
+fit
+display a1 p1
+
+set nbshapes_expected "
+Number of shapes in shape
+ VERTEX    : 5
+ EDGE      : 5
+ WIRE      : 0
+ FACE      : 0
+ SHELL     : 0
+ SOLID     : 0
+ COMPSOLID : 0
+ COMPOUND  : 1
+ SHAPE     : 11
+"
+
+checknbshapes result -ref ${nbshapes_expected} -t -m "SECTION"
+
+regexp {Tolerance +MAX=([-0-9.+eE]+)} [tolerance result] full MaxTolerance
+puts "MaxTolerance=$MaxTolerance"
+
+set expected_MaxTolerance 7.0623347214107758e-005
+set tol_abs_MaxTolerance 0.0
+set tol_rel_MaxTolerance 0.01
+checkreal "MaxTolerance" ${MaxTolerance} ${expected_MaxTolerance} ${tol_abs_MaxTolerance} ${tol_rel_MaxTolerance}
+
+set log [checksection result]
+
+if { [string compare -nocase $log " nb alone Vertices : 0\n\n"] } {
+  puts "ERROR: the section is not closed"
+} else {
+  puts "The section is OK"
+}
+
+set only_screen_axo 1
\ No newline at end of file
diff --git a/tests/bugs/modalg_6/bug26841_2 b/tests/bugs/modalg_6/bug26841_2
new file mode 100644 (file)
index 0000000..591aec9
--- /dev/null
@@ -0,0 +1,51 @@
+puts "============"
+puts "OCC26841"
+puts "============"
+puts ""
+###############################
+## Wrong result obtained by intersection algorithm.
+###############################
+
+restore [locate_data_file bug26841c3-prism.brep] p3
+restore [locate_data_file bug26841c3-deck.brep] a3
+
+bsection result a3 p3 -n2d2
+
+smallview
+donly result
+fit
+display a3 p3
+
+
+set nbshapes_expected "
+Number of shapes in shape
+ VERTEX    : 10
+ EDGE      : 10
+ WIRE      : 0
+ FACE      : 0
+ SHELL     : 0
+ SOLID     : 0
+ COMPSOLID : 0
+ COMPOUND  : 1
+ SHAPE     : 21
+"
+
+checknbshapes result -ref ${nbshapes_expected} -t -m "SECTION"
+
+regexp {Tolerance +MAX=([-0-9.+eE]+)} [tolerance result] full MaxTolerance
+puts "MaxTolerance=$MaxTolerance"
+
+set expected_MaxTolerance 0.00010145423883977269
+set tol_abs_MaxTolerance 0.0
+set tol_rel_MaxTolerance 0.001
+checkreal "MaxTolerance" ${MaxTolerance} ${expected_MaxTolerance} ${tol_abs_MaxTolerance} ${tol_rel_MaxTolerance}
+
+set log [checksection result]
+
+if { [string compare -nocase $log " nb alone Vertices : 0\n\n"] } {
+  puts "ERROR: the section is not closed"
+} else {
+  puts "The section is OK"
+}
+
+set only_screen_axo 1
\ No newline at end of file