From 53dd57f0c4fc736ab9f81c1eaad66caf51054bcb Mon Sep 17 00:00:00 2001 From: nbv Date: Thu, 26 Oct 2017 10:39:22 +0300 Subject: [PATCH] 0029260: Boolean operation hangs on the intersection stage Only alignment has been changed. Regressions on native version (OCCT 7.0, Win32, VS12 2013): Failed blend simple G6 boolean bopfuse_simple ZP6 boolean gdml_private ZI7 ZJ7 boolean volumemaker A8 H4 bugs fclasses bug181_1 bugs modalg_6 bug26980 bug27021 bugs moddata_2 bug453_3 bugs vis bug21091_3 bug21091_4 bug21091_5 bug21091_6 bug21091_8 bug21091_9 demo draw getsource Improvements boolean bcommon_complex C7 boolean bcut_complex Q1 bugs caf bug1919 de step_3 D8 --- src/Adaptor3d/Adaptor3d_TopolTool.cxx | 426 +++++++++++++++----------- 1 file changed, 241 insertions(+), 185 deletions(-) diff --git a/src/Adaptor3d/Adaptor3d_TopolTool.cxx b/src/Adaptor3d/Adaptor3d_TopolTool.cxx index fcf9ae978f..1d9a5754d1 100644 --- a/src/Adaptor3d/Adaptor3d_TopolTool.cxx +++ b/src/Adaptor3d/Adaptor3d_TopolTool.cxx @@ -932,12 +932,12 @@ void Adaptor3d_TopolTool::SamplePnts(const Standard_Real theDefl, //purpose : //======================================================================= -void Adaptor3d_TopolTool::BSplSamplePnts(const Standard_Real theDefl, - const Standard_Integer theNUmin, - const Standard_Integer theNVmin) -{ +void Adaptor3d_TopolTool::BSplSamplePnts(const Standard_Real theDefl, + const Standard_Integer theNUmin, + const Standard_Integer theNVmin) +{ const Handle(Geom_BSplineSurface)& aBS = myS->BSpline(); - Standard_Real uinf,usup,vinf,vsup; + Standard_Real uinf, usup, vinf, vsup; uinf = myS->FirstUParameter(); usup = myS->LastUParameter(); vinf = myS->FirstVParameter(); vsup = myS->LastVParameter(); @@ -948,49 +948,61 @@ void Adaptor3d_TopolTool::BSplSamplePnts(const Standard_Real theDefl, Standard_Integer vi1 = aBS->FirstVKnotIndex(); Standard_Integer vi2 = aBS->LastVKnotIndex(); - for(i = ui1; i < ui2; ++i) { - if(uinf >= aBS->UKnot(i) && uinf < aBS->UKnot(i+1)) { + for(i = ui1; i < ui2; ++i) + { + if(uinf >= aBS->UKnot(i) && uinf < aBS->UKnot(i + 1)) + { ui1 = i; break; } } - for(i = ui2; i > ui1; --i) { - if(usup <= aBS->UKnot(i) && usup > aBS->UKnot(i-1)) { + for(i = ui2; i > ui1; --i) + { + if(usup <= aBS->UKnot(i) && usup > aBS->UKnot(i - 1)) + { ui2 = i; break; } } - for(i = vi1; i < vi2; ++i) { - if(vinf >= aBS->VKnot(i) && vinf < aBS->VKnot(i+1)) { + for(i = vi1; i < vi2; ++i) + { + if(vinf >= aBS->VKnot(i) && vinf < aBS->VKnot(i + 1)) + { vi1 = i; break; } } - for(i = vi2; i > vi1; --i) { - if(vsup <= aBS->VKnot(i) && vsup > aBS->VKnot(i-1)) { + for(i = vi2; i > vi1; --i) + { + if(vsup <= aBS->VKnot(i) && vsup > aBS->VKnot(i - 1)) + { vi2 = i; break; } } - Standard_Integer nbsu = ui2-ui1+1; nbsu += (nbsu - 1) * (aBS->UDegree()-1); - Standard_Integer nbsv = vi2-vi1+1; nbsv += (nbsv - 1) * (aBS->VDegree()-1); + Standard_Integer nbsu = ui2 - ui1 + 1; nbsu += (nbsu - 1) * (aBS->UDegree() - 1); + Standard_Integer nbsv = vi2 - vi1 + 1; nbsv += (nbsv - 1) * (aBS->VDegree() - 1); Standard_Boolean bUuniform = Standard_False; Standard_Boolean bVuniform = Standard_False; //modified by NIZHNY-EMV Mon Jun 10 14:19:04 2013 - if (nbsu < theNUmin || nbsv < theNVmin) { + if(nbsu < theNUmin || nbsv < theNVmin) + { Standard_Integer aNb; - if (nbsu < nbsv) { - aNb = (Standard_Integer)(nbsv * ((Standard_Real)theNUmin)/((Standard_Real)nbsu)); + if(nbsu < nbsv) + { + aNb = (Standard_Integer) (nbsv * ((Standard_Real) theNUmin) / ((Standard_Real) nbsu)); aNb = Min(aNb, 30); bVuniform = (aNb > nbsv) ? Standard_True : bVuniform; nbsv = bVuniform ? aNb : nbsv; - } else { - aNb = (Standard_Integer)(nbsu * ((Standard_Real)theNVmin)/((Standard_Real)nbsv)); + } + else + { + aNb = (Standard_Integer) (nbsu * ((Standard_Real) theNVmin) / ((Standard_Real) nbsv)); aNb = Min(aNb, 30); bUuniform = (aNb > nbsu) ? Standard_True : bUuniform; nbsu = bUuniform ? aNb : nbsu; @@ -998,12 +1010,14 @@ void Adaptor3d_TopolTool::BSplSamplePnts(const Standard_Real theDefl, } //modified by NIZHNY-EMV Mon Jun 10 14:19:05 2013 - if(nbsu < theNUmin) { + if(nbsu < theNUmin) + { nbsu = theNUmin; bUuniform = Standard_True; } - if(nbsv < theNVmin) { + if(nbsv < theNVmin) + { nbsv = theNVmin; bVuniform = Standard_True; } @@ -1014,76 +1028,86 @@ void Adaptor3d_TopolTool::BSplSamplePnts(const Standard_Real theDefl, TColStd_Array1OfBoolean aVFlg(1, nbsv); //Filling of sample parameters - if(bUuniform) { + if(bUuniform) + { t1 = uinf; t2 = usup; - dt = (t2 - t1)/(nbsu - 1); + dt = (t2 - t1) / (nbsu - 1); anUPars(1) = t1; anUFlg(1) = Standard_False; anUPars(nbsu) = t2; anUFlg(nbsu) = Standard_False; - for(i = 2, t1 += dt; i < nbsu; ++i, t1 += dt) { + for(i = 2, t1 += dt; i < nbsu; ++i, t1 += dt) + { anUPars(i) = t1; anUFlg(i) = Standard_False; } } - else { + else + { Standard_Integer nbi = aBS->UDegree(); k = 0; t1 = uinf; - for(i = ui1+1; i <= ui2; ++i) { + for(i = ui1 + 1; i <= ui2; ++i) + { if(i == ui2) t2 = usup; else t2 = aBS->UKnot(i); - dt = (t2 - t1)/nbi; + dt = (t2 - t1) / nbi; j = 1; - do { - ++k; - anUPars(k) = t1; - anUFlg(k) = Standard_False; - t1 += dt; + do + { + ++k; + anUPars(k) = t1; + anUFlg(k) = Standard_False; + t1 += dt; } - while (++j <= nbi); + while(++j <= nbi); t1 = t2; } ++k; anUPars(k) = t1; } - if(bVuniform) { + if(bVuniform) + { t1 = vinf; t2 = vsup; - dt = (t2 - t1)/(nbsv - 1); + dt = (t2 - t1) / (nbsv - 1); aVPars(1) = t1; aVFlg(1) = Standard_False; aVPars(nbsv) = t2; aVFlg(nbsv) = Standard_False; - for(i = 2, t1 += dt; i < nbsv; ++i, t1 += dt) { + for(i = 2, t1 += dt; i < nbsv; ++i, t1 += dt) + { aVPars(i) = t1; aVFlg(i) = Standard_False; } } - else { + else + { Standard_Integer nbi = aBS->VDegree(); k = 0; t1 = vinf; - for(i = vi1+1; i <= vi2; ++i) { + for(i = vi1 + 1; i <= vi2; ++i) + { if(i == vi2) t2 = vsup; else t2 = aBS->VKnot(i); - dt = (t2 - t1)/nbi; + dt = (t2 - t1) / nbi; j = 1; - do { - ++k; - aVPars(k) = t1; - aVFlg(k) = Standard_False; - t1 += dt; + do + { + ++k; + aVPars(k) = t1; + aVFlg(k) = Standard_False; + t1 += dt; } - while (++j <= nbi); + while(++j <= nbi); t1 = t2; } ++k; aVPars(k) = t1; } - + //Analysis of deflection Standard_Real aDefl2 = Max(theDefl*theDefl, 1.e-9); @@ -1097,60 +1121,68 @@ void Adaptor3d_TopolTool::BSplSamplePnts(const Standard_Real theDefl, anUFlg(1) = Standard_True; anUFlg(nbsu) = Standard_True; //myNbSamplesU = 2; - for(i = 1; i <= nbsv; ++i) { + for(i = 1; i <= nbsv; ++i) + { t1 = aVPars(i); j = 1; Standard_Boolean bCont = Standard_True; - while (j < nbsu-1 && bCont) { + while(j < nbsu - 1 && bCont) + { - if(anUFlg(j+1)) { - ++j; - continue; + if(anUFlg(j + 1)) + { + ++j; + continue; } t2 = anUPars(j); -// gp_Pnt p1 = aBS->Value(t2, t1); + // gp_Pnt p1 = aBS->Value(t2, t1); gp_Pnt p1 = aBSplAdaptor.Value(t2, t1); - for(k = j+2; k <= nbsu; ++k) { - t2 = anUPars(k); -// gp_Pnt p2 = aBS->Value(t2, t1); - gp_Pnt p2 = aBSplAdaptor.Value(t2, t1); - //gce_MakeLin MkLin(p1, p2); - //const gp_Lin& lin = MkLin.Value(); - - if(p1.SquareDistance(p2) <= tol) continue; - - gp_Lin lin(p1, gp_Dir(gp_Vec(p1, p2))); - Standard_Boolean ok = Standard_True; - for(l = j+1; l < k; ++l) { - - if(anUFlg(l)) { - ok = Standard_False; - break; - } - -// gp_Pnt pp = aBS->Value(anUPars(l), t1); - gp_Pnt pp = aBSplAdaptor.Value(anUPars(l), t1); - Standard_Real d = lin.SquareDistance(pp); - - if(d <= aDefl2) continue; - - ok = Standard_False; - break; - } + for(k = j + 2; k <= nbsu; ++k) + { + t2 = anUPars(k); + // gp_Pnt p2 = aBS->Value(t2, t1); + gp_Pnt p2 = aBSplAdaptor.Value(t2, t1); + //gce_MakeLin MkLin(p1, p2); + //const gp_Lin& lin = MkLin.Value(); + + if(p1.SquareDistance(p2) <= tol) continue; + + gp_Lin lin(p1, gp_Dir(gp_Vec(p1, p2))); + Standard_Boolean ok = Standard_True; + for(l = j + 1; l < k; ++l) + { + + if(anUFlg(l)) + { + ok = Standard_False; + break; + } + + // gp_Pnt pp = aBS->Value(anUPars(l), t1); + gp_Pnt pp = aBSplAdaptor.Value(anUPars(l), t1); + Standard_Real d = lin.SquareDistance(pp); + + if(d <= aDefl2) continue; + + ok = Standard_False; + break; + } + + if(!ok) + { + j = k - 1; + anUFlg(j) = Standard_True; + //++myNbSamplesU; + break; + } + + if(anUFlg(k)) + { + j = k; + break; + } - if(!ok) { - j = k - 1; - anUFlg(j) = Standard_True; - //++myNbSamplesU; - break; - } - - if(anUFlg(k)) { - j = k; - break; - } - } @@ -1160,84 +1192,95 @@ void Adaptor3d_TopolTool::BSplSamplePnts(const Standard_Real theDefl, } myNbSamplesU = 0; - for (i = 1; i <= nbsu; i++) - if (anUFlg(i) == Standard_True) + for(i = 1; i <= nbsu; i++) + if(anUFlg(i) == Standard_True) myNbSamplesU++; - - if(myNbSamplesU < myMinPnts) { - if(myNbSamplesU == 2) { + + if(myNbSamplesU < myMinPnts) + { + if(myNbSamplesU == 2) + { //"uniform" distribution; - Standard_Integer nn = nbsu/myMinPnts; - anUFlg(1+nn) = Standard_True; - anUFlg(nbsu-nn) = Standard_True; + Standard_Integer nn = nbsu / myMinPnts; + anUFlg(1 + nn) = Standard_True; + anUFlg(nbsu - nn) = Standard_True; } - else { //myNbSamplesU == 3 + else + { //myNbSamplesU == 3 //insert in bigger segment i = 2; while(!anUFlg(i++)); - if(i < nbsu/2) j = Min(i+(nbsu-i)/2, nbsu-1); - else j = Max(i/2, 2); + if(i < nbsu / 2) j = Min(i + (nbsu - i) / 2, nbsu - 1); + else j = Max(i / 2, 2); } anUFlg(j) = Standard_True; myNbSamplesU = myMinPnts; } - + aVFlg(1) = Standard_True; aVFlg(nbsv) = Standard_True; //myNbSamplesV = 2; - for(i = 1; i <= nbsu; ++i) { + for(i = 1; i <= nbsu; ++i) + { t1 = anUPars(i); j = 1; Standard_Boolean bCont = Standard_True; - while (j < nbsv-1 && bCont) { + while(j < nbsv - 1 && bCont) + { - if(aVFlg(j+1)) { - ++j; - continue; + if(aVFlg(j + 1)) + { + ++j; + continue; } t2 = aVPars(j); -// gp_Pnt p1 = aBS->Value(t1, t2); + // gp_Pnt p1 = aBS->Value(t1, t2); gp_Pnt p1 = aBSplAdaptor.Value(t1, t2); - for(k = j+2; k <= nbsv; ++k) { - t2 = aVPars(k); -// gp_Pnt p2 = aBS->Value(t1, t2); - gp_Pnt p2 = aBSplAdaptor.Value(t1, t2); - - if(p1.SquareDistance(p2) <= tol) continue; - //gce_MakeLin MkLin(p1, p2); - //const gp_Lin& lin = MkLin.Value(); - gp_Lin lin(p1, gp_Dir(gp_Vec(p1, p2))); - Standard_Boolean ok = Standard_True; - for(l = j+1; l < k; ++l) { - - if(aVFlg(l)) { - ok = Standard_False; - break; - } - -// gp_Pnt pp = aBS->Value(t1, aVPars(l)); - gp_Pnt pp = aBSplAdaptor.Value(t1, aVPars(l)); - Standard_Real d = lin.SquareDistance(pp); - - if(d <= aDefl2) continue; - - ok = Standard_False; - break; - } + for(k = j + 2; k <= nbsv; ++k) + { + t2 = aVPars(k); + // gp_Pnt p2 = aBS->Value(t1, t2); + gp_Pnt p2 = aBSplAdaptor.Value(t1, t2); + + if(p1.SquareDistance(p2) <= tol) continue; + //gce_MakeLin MkLin(p1, p2); + //const gp_Lin& lin = MkLin.Value(); + gp_Lin lin(p1, gp_Dir(gp_Vec(p1, p2))); + Standard_Boolean ok = Standard_True; + for(l = j + 1; l < k; ++l) + { + + if(aVFlg(l)) + { + ok = Standard_False; + break; + } + + // gp_Pnt pp = aBS->Value(t1, aVPars(l)); + gp_Pnt pp = aBSplAdaptor.Value(t1, aVPars(l)); + Standard_Real d = lin.SquareDistance(pp); + + if(d <= aDefl2) continue; + + ok = Standard_False; + break; + } + + if(!ok) + { + j = k - 1; + aVFlg(j) = Standard_True; + //++myNbSamplesV; + break; + } + + if(aVFlg(k)) + { + j = k; + break; + } - if(!ok) { - j = k - 1; - aVFlg(j) = Standard_True; - //++myNbSamplesV; - break; - } - - if(aVFlg(k)) { - j = k; - break; - } - } @@ -1247,24 +1290,27 @@ void Adaptor3d_TopolTool::BSplSamplePnts(const Standard_Real theDefl, } myNbSamplesV = 0; - for (i = 1; i <= nbsv; i++) - if (aVFlg(i) == Standard_True) + for(i = 1; i <= nbsv; i++) + if(aVFlg(i) == Standard_True) myNbSamplesV++; - - if(myNbSamplesV < myMinPnts) { - if(myNbSamplesV == 2) { + + if(myNbSamplesV < myMinPnts) + { + if(myNbSamplesV == 2) + { //"uniform" distribution; - Standard_Integer nn = nbsv/myMinPnts; - aVFlg(1+nn) = Standard_True; - aVFlg(nbsv-nn) = Standard_True; + Standard_Integer nn = nbsv / myMinPnts; + aVFlg(1 + nn) = Standard_True; + aVFlg(nbsv - nn) = Standard_True; myNbSamplesV = myMinPnts; } - else { //myNbSamplesU == 3 + else + { //myNbSamplesU == 3 //insert in bigger segment i = 2; while(!aVFlg(i++)); - if(i < nbsv/2) j = Min(i+(nbsv-i)/2, nbsv-1); - else j = Max(i/2, 2); + if(i < nbsv / 2) j = Min(i + (nbsv - i) / 2, nbsv - 1); + else j = Max(i / 2, 2); } myNbSamplesV = myMinPnts; aVFlg(j) = Standard_True; @@ -1275,41 +1321,51 @@ void Adaptor3d_TopolTool::BSplSamplePnts(const Standard_Real theDefl, Standard_Boolean bFlag; // // U - bFlag=(myNbSamplesU < theNUmin); - if (bFlag) { - myNbSamplesU=nbsu; + bFlag = (myNbSamplesU < theNUmin); + if(bFlag) + { + myNbSamplesU = nbsu; } // myUPars = new TColStd_HArray1OfReal(1, myNbSamplesU); // - for(j = 0, i = 1; i <= nbsu; ++i) { - if (bFlag) { - myUPars->SetValue(i,anUPars(i)); + for(j = 0, i = 1; i <= nbsu; ++i) + { + if(bFlag) + { + myUPars->SetValue(i, anUPars(i)); } - else { - if(anUFlg(i)) { + else + { + if(anUFlg(i)) + { ++j; - myUPars->SetValue(j,anUPars(i)); + myUPars->SetValue(j, anUPars(i)); } } } // // V - bFlag=(myNbSamplesV < theNVmin); - if (bFlag) { - myNbSamplesV=nbsv; + bFlag = (myNbSamplesV < theNVmin); + if(bFlag) + { + myNbSamplesV = nbsv; } // myVPars = new TColStd_HArray1OfReal(1, myNbSamplesV); // - for(j = 0, i = 1; i <= nbsv; ++i) { - if (bFlag) { - myVPars->SetValue(i,aVPars(i)); + for(j = 0, i = 1; i <= nbsv; ++i) + { + if(bFlag) + { + myVPars->SetValue(i, aVPars(i)); } - else { - if(aVFlg(i)) { + else + { + if(aVFlg(i)) + { ++j; - myVPars->SetValue(j,aVPars(i)); + myVPars->SetValue(j, aVPars(i)); } } } @@ -1320,18 +1376,18 @@ void Adaptor3d_TopolTool::BSplSamplePnts(const Standard_Real theDefl, j = 0; for(i = 1; i <= nbsu; ++i) { - if(anUFlg(i)) { - ++j; - myUPars->SetValue(j,anUPars(i)); - } + if(anUFlg(i)) { + ++j; + myUPars->SetValue(j,anUPars(i)); + } } j = 0; for(i = 1; i <= nbsv; ++i) { - if(aVFlg(i)) { - ++j; - myVPars->SetValue(j,aVPars(i)); - } + if(aVFlg(i)) { + ++j; + myVPars->SetValue(j,aVPars(i)); + } } */ //modified by NIZNHY-PKV Mon Dec 26 12:25:35 2011t -- 2.39.5