From 8ebd2632e26962063eb7e04efa0ba05f0114ab11 Mon Sep 17 00:00:00 2001 From: nbv Date: Mon, 21 Dec 2015 13:30:00 +0300 Subject: [PATCH] Patch for issue #26841 --- src/BOPTest/BOPTest_BOPCommands.cxx | 28 +++++++++++--- src/IntTools/IntTools_FaceFace.cxx | 60 +++++++++++++++++++---------- tests/boolean/bsection/M3 | 44 ++++++++++++++++++++- tests/bugs/modalg_1/buc60462_2 | 3 ++ tests/bugs/modalg_2/bug472_3 | 1 + tests/bugs/modalg_6/bug26841_1 | 50 ++++++++++++++++++++++++ tests/bugs/modalg_6/bug26841_2 | 51 ++++++++++++++++++++++++ 7 files changed, 210 insertions(+), 27 deletions(-) create mode 100644 tests/bugs/modalg_6/bug26841_1 create mode 100644 tests/bugs/modalg_6/bug26841_2 diff --git a/src/BOPTest/BOPTest_BOPCommands.cxx b/src/BOPTest/BOPTest_BOPCommands.cxx index cae3fabf59..9ca053c35e 100644 --- a/src/BOPTest/BOPTest_BOPCommands.cxx +++ b/src/BOPTest/BOPTest_BOPCommands.cxx @@ -54,6 +54,7 @@ #include #include +#include // 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); // diff --git a/src/IntTools/IntTools_FaceFace.cxx b/src/IntTools/IntTools_FaceFace.cxx index ff86dfce3d..b3a1ba5134 100644 --- a/src/IntTools/IntTools_FaceFace.cxx +++ b/src/IntTools/IntTools_FaceFace.cxx @@ -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; diff --git a/tests/boolean/bsection/M3 b/tests/boolean/bsection/M3 index 08a3f95292..a25da78dcd 100644 --- a/tests/boolean/bsection/M3 +++ b/tests/boolean/bsection/M3 @@ -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 diff --git a/tests/bugs/modalg_1/buc60462_2 b/tests/bugs/modalg_1/buc60462_2 index bfe611097c..5600525f17 100755 --- a/tests/bugs/modalg_1/buc60462_2 +++ b/tests/bugs/modalg_1/buc60462_2 @@ -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 diff --git a/tests/bugs/modalg_2/bug472_3 b/tests/bugs/modalg_2/bug472_3 index db34c1aebe..64b992077d 100755 --- a/tests/bugs/modalg_2/bug472_3 +++ b/tests/bugs/modalg_2/bug472_3 @@ -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 index 0000000000..b149005efc --- /dev/null +++ b/tests/bugs/modalg_6/bug26841_1 @@ -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 index 0000000000..591aec9400 --- /dev/null +++ b/tests/bugs/modalg_6/bug26841_2 @@ -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 -- 2.39.5