From cfdd99315c3c8e5693c58aa6c3db0ae542a848af Mon Sep 17 00:00:00 2001 From: pkv Date: Thu, 3 Apr 2014 15:29:23 +0400 Subject: [PATCH] 0024764: Alien subshapes occured in result of 'bopcheck' operation class BOPAlgo_ArgumentAnalyzer - method: void BOPAlgo_ArgumentAnalyzer::TestSelfInterferences() The new shapes has been excluded from the treatment void BOPAlgo_CheckerSI::PostTreat() The new shapes has been excluded from the treatment Standard_Integer bopcheck (Draw_Interpretor& di, Standard_Integer n, const char** a ) The new shapes has been excluded from the treatment. The interferences of the type */Solid has been included in the treatment. Test case for issue CR24764 --- src/BOPAlgo/BOPAlgo_ArgumentAnalyzer.cxx | 84 +++++++------- src/BOPAlgo/BOPAlgo_CheckerSI.cxx | 69 ++++++++---- src/BOPTest/BOPTest_CheckCommands.cxx | 133 +++++++++++++++++------ tests/bugs/modalg_5/bug24764 | 32 ++++++ 4 files changed, 220 insertions(+), 98 deletions(-) create mode 100755 tests/bugs/modalg_5/bug24764 diff --git a/src/BOPAlgo/BOPAlgo_ArgumentAnalyzer.cxx b/src/BOPAlgo/BOPAlgo_ArgumentAnalyzer.cxx index 93e9479940..3326863a2d 100644 --- a/src/BOPAlgo/BOPAlgo_ArgumentAnalyzer.cxx +++ b/src/BOPAlgo/BOPAlgo_ArgumentAnalyzer.cxx @@ -338,54 +338,60 @@ void BOPAlgo_ArgumentAnalyzer::TestSelfInterferences() BOPDS_VectorOfInterfFZ& aFZs=theDS->InterfFZ(); BOPDS_VectorOfInterfZZ& aZZs=theDS->InterfZZ(); // - const Standard_Integer aNbTypeInt=10; - Standard_Integer aTypeInt, i, nI1, nI2; - Standard_Integer aNb[aNbTypeInt] = { + Standard_Integer aNbTypeInt, aTypeInt, i, nI1, nI2; + Standard_Integer aNb[] = { aVVs.Extent(), aVEs.Extent(), aEEs.Extent(), aVFs.Extent(), aEFs.Extent(), aFFs.Extent(), - aVZs.Extent(), aEZs.Extent(), aFZs.Extent(), aZZs.Extent()}; + aVZs.Extent(), aEZs.Extent(), aFZs.Extent(), + aZZs.Extent() + }; + // BOPDS_Interf* aInt=NULL; // + aNbTypeInt=BOPDS_DS::NbInterfTypes(); for (aTypeInt = 0; aTypeInt < aNbTypeInt; ++aTypeInt) { for (i = 0; i < aNb[aTypeInt]; ++i) { - switch(aTypeInt) { - case 0: - aInt=(BOPDS_Interf*)(&aVVs(i)); - break; - case 1: - aInt=(BOPDS_Interf*)(&aVEs(i)); - break; - case 2: - aInt=(BOPDS_Interf*)(&aEEs(i)); - break; - case 3: - aInt=(BOPDS_Interf*)(&aVFs(i)); - break; - case 4: - aInt=(BOPDS_Interf*)(&aEFs(i)); - break; - case 5: - aInt=(BOPDS_Interf*)(&aFFs(i)); - break; - case 6: - aInt=(BOPDS_Interf*)(&aVZs(i)); - break; - case 7: - aInt=(BOPDS_Interf*)(&aEZs(i)); - break; - case 8: - aInt=(BOPDS_Interf*)(&aFZs(i)); - break; - case 9: - aInt=(BOPDS_Interf*)(&aZZs(i)); - break; - default: - aInt=NULL; - } + switch(aTypeInt) { + case 0: + aInt=(BOPDS_Interf*)(&aVVs(i)); + break; + case 1: + aInt=(BOPDS_Interf*)(&aVEs(i)); + break; + case 2: + aInt=(BOPDS_Interf*)(&aEEs(i)); + break; + case 3: + aInt=(BOPDS_Interf*)(&aVFs(i)); + break; + case 4: + aInt=(BOPDS_Interf*)(&aEFs(i)); + break; + case 5: + aInt=(BOPDS_Interf*)(&aFFs(i)); + break; + case 6: + aInt=(BOPDS_Interf*)(&aVZs(i)); + break; + case 7: + aInt=(BOPDS_Interf*)(&aEZs(i)); + break; + case 8: + aInt=(BOPDS_Interf*)(&aFZs(i)); + break; + case 9: + aInt=(BOPDS_Interf*)(&aZZs(i)); + break; + default: + aInt=NULL; + } // - aInt->Indices(nI1, nI2); + aInt->Indices(nI1, nI2); if (nI1 == nI2) { continue; + } + if (theDS->IsNewShape(nI1) || theDS->IsNewShape(nI2)) { + continue; } // if (aTypeInt == 4) { diff --git a/src/BOPAlgo/BOPAlgo_CheckerSI.cxx b/src/BOPAlgo/BOPAlgo_CheckerSI.cxx index 1c9ce0e954..c6aa133194 100644 --- a/src/BOPAlgo/BOPAlgo_CheckerSI.cxx +++ b/src/BOPAlgo/BOPAlgo_CheckerSI.cxx @@ -125,7 +125,6 @@ void BOPAlgo_CheckerSI::Init() //======================================================================= void BOPAlgo_CheckerSI::Perform() { - try { OCC_CATCH_SIGNALS // @@ -143,42 +142,46 @@ void BOPAlgo_CheckerSI::Perform() } // BOPAlgo_PaveFiller::Perform(); - if (myErrorStatus) { - return; + // + if (!myErrorStatus) { + PerformVZ(); } // - PerformVZ(); - if (myErrorStatus) { - return; - } - // - PerformEZ(); - if (myErrorStatus) { - return; + if (!myErrorStatus) { + PerformEZ(); } // - PerformFZ(); - if (myErrorStatus) { - return; + if (!myErrorStatus) { + PerformFZ(); } // - PerformZZ(); - if (myErrorStatus) { - return; + if (!myErrorStatus) { + PerformZZ(); + } + // + if (!myErrorStatus) { + PostTreat(); } // - PostTreat(); - if (myErrorStatus) { - return; + if (myNonDestructive) { + Standard_Integer iErr; + // + iErr=myErrorStatus; + // + PostTreatCopy(); + if (!myErrorStatus) { + myErrorStatus=iErr; + } } - // + } + // + catch (Standard_Failure) { if (myNonDestructive) { PostTreatCopy(); } - } - catch (Standard_Failure) { + // myErrorStatus=11; - } + } } //======================================================================= @@ -202,6 +205,9 @@ void BOPAlgo_CheckerSI::PostTreat() for (i=0; i!=aNb; ++i) { const BOPDS_InterfVV& aVV=aVVs(i); aVV.Indices(n1, n2); + if (myDS->IsNewShape(n1) || myDS->IsNewShape(n2)) { + continue; + } aPK.SetIds(n1, n2); aMPK.Add(aPK); } @@ -212,6 +218,9 @@ void BOPAlgo_CheckerSI::PostTreat() for (i=0; i!=aNb; ++i) { const BOPDS_InterfVE& aVE=aVEs(i); aVE.Indices(n1, n2); + if (myDS->IsNewShape(n1) || myDS->IsNewShape(n2)) { + continue; + } aPK.SetIds(n1, n2); aMPK.Add(aPK); } @@ -222,6 +231,9 @@ void BOPAlgo_CheckerSI::PostTreat() for (i=0; i!=aNb; ++i) { const BOPDS_InterfEE& aEE=aEEs(i); aEE.Indices(n1, n2); + if (myDS->IsNewShape(n1) || myDS->IsNewShape(n2)) { + continue; + } aPK.SetIds(n1, n2); aMPK.Add(aPK); } @@ -232,6 +244,9 @@ void BOPAlgo_CheckerSI::PostTreat() for (i=0; i!=aNb; ++i) { const BOPDS_InterfVF& aVF=aVFs(i); aVF.Indices(n1, n2); + if (myDS->IsNewShape(n1) || myDS->IsNewShape(n2)) { + continue; + } aPK.SetIds(n1, n2); aMPK.Add(aPK); } @@ -245,6 +260,9 @@ void BOPAlgo_CheckerSI::PostTreat() continue; } aEF.Indices(n1, n2); + if (myDS->IsNewShape(n1) || myDS->IsNewShape(n2)) { + continue; + } aPK.SetIds(n1, n2); aMPK.Add(aPK); } @@ -304,6 +322,9 @@ void BOPAlgo_CheckerSI::PostTreat() // const BOPDS_InterfVZ& aVZ=aVZs(i); aVZ.Indices(n1, n2); + if (myDS->IsNewShape(n1) || myDS->IsNewShape(n2)) { + continue; + } aPK.SetIds(n1, n2); aMPK.Add(aPK); } diff --git a/src/BOPTest/BOPTest_CheckCommands.cxx b/src/BOPTest/BOPTest_CheckCommands.cxx index 082e7ec250..50d614c826 100644 --- a/src/BOPTest/BOPTest_CheckCommands.cxx +++ b/src/BOPTest/BOPTest_CheckCommands.cxx @@ -28,6 +28,13 @@ #include #include + +#include + +#include + +#include + #include #include #include @@ -35,12 +42,13 @@ #include #include #include -#include +#include +#include +#include +#include -#include #include #include -#include static Standard_Integer bopcheck (Draw_Interpretor&, Standard_Integer, const char** ); @@ -79,46 +87,61 @@ Standard_Integer bopcheck (Draw_Interpretor& di, Standard_Integer n, const char** a ) { if (n<2) { - di << " Use >bopcheck Shape [level of check: 0 - 5" << "\n"; + di << " Use >bopcheck Shape [level of check: 0 - 9" << "\n"; di << " The level of check defines "; - di << " which interferferences will be checked:\n"; - di << " 0 - only V/V;\n"; - di << " 1 - V/V and V/E;\n"; - di << " 2 - V/V, V/E and E/E;\n"; - di << " 3 - V/V, V/E, E/E and V/F;\n"; - di << " 4 - V/V, V/E, E/E, V/F and E/F;\n"; - di << " 5 - all interferences, default value.\n"; + di << " which interferences will be checked:\n"; + di << " 0 - V/V only\n"; + di << " 1 - V/V, V/E\n"; + di << " 2 - V/V, V/E, E/E\n"; + di << " 3 - V/V, V/E, E/E , V/F\n"; + di << " 4 - V/V, V/E, E/E, V/F , E/F\n"; + di << " 5 - V/V, V/E, E/E, V/F, E/F, F/F;\n"; + di << " 6 - V/V, V/E, E/E, V/F, E/F, F/F, V/Z\n"; + di << " 7 - V/V, V/E, E/E, V/F, E/F, F/F, E/Z\n"; + di << " 8 - V/V, V/E, E/E, V/F, E/F, F/F, E/Z, F/Z\n"; + di << " 9 - V/V, V/E, E/E, V/F, E/F, F/F, E/Z, F/Z, Z/Z\n"; + di << " Default level is 9\n"; return 1; } - - TopoDS_Shape aS1 = DBRep::Get(a[1]); - if (aS1.IsNull()) { + // + TopoDS_Shape aS = DBRep::Get(a[1]); + if (aS.IsNull()) { di << "null shapes are not allowed here!"; return 1; } - TopoDS_Shape aS = aS1; // - Standard_Integer iErr, aTypeInt, i, ind, j; - Standard_Integer nI1, nI2, theLevelOfCheck; - Standard_Boolean bSelfInt, bFFInt; + Standard_Integer theLevelOfCheck, aNbInterfTypes; + // + aNbInterfTypes=BOPDS_DS::NbInterfTypes(); + // + theLevelOfCheck = (n==3) ? Draw::Atoi(a[2]) : aNbInterfTypes-1; + if (theLevelOfCheck > aNbInterfTypes-1) { + di << "Invalid level"; + return 1; + } + //------------------------------------------------------------------- char buf[256]; - char type[6][4] = {"V/V", "V/E", "E/E","V/F", "E/F", "F/F"}; - - theLevelOfCheck = (n==3) ? Draw::Atoi(a[2]) : 5; - if (theLevelOfCheck >= 0 && theLevelOfCheck < 5) { + char type[10][4] = { + "V/V", "V/E", "E/E","V/F", "E/F", "F/F", "V/Z", "E/Z", "F/Z", "Z/Z" + }; + Standard_Integer iErr, aTypeInt, i, ind, j, nI1, nI2; + Standard_Boolean bSelfInt, bFFInt; + // + if (theLevelOfCheck >= 0 && theLevelOfCheck < aNbInterfTypes) { di << "Info:\nThe level of check is set to " << type[theLevelOfCheck] << ", i.e. intersection(s)\n"; - for (i=theLevelOfCheck+1; i<=5; ++i) { + for (i=theLevelOfCheck+1; iInterfVF(); BOPDS_VectorOfInterfEF& aEFs=theDS->InterfEF(); BOPDS_VectorOfInterfFF& aFFs=theDS->InterfFF(); + BOPDS_VectorOfInterfVZ& aVZs=theDS->InterfVZ(); + BOPDS_VectorOfInterfEZ& aEZs=theDS->InterfEZ(); + BOPDS_VectorOfInterfFZ& aFZs=theDS->InterfFZ(); + BOPDS_VectorOfInterfZZ& aZZs=theDS->InterfZZ(); // - Standard_Integer aNb[6] ={ + Standard_Integer aNb[] ={ aVVs.Extent(), aVEs.Extent(), aEEs.Extent(), - aVFs.Extent(), aEFs.Extent(), aFFs.Extent() + aVFs.Extent(), aEFs.Extent(), aFFs.Extent(), + aVZs.Extent(), aEZs.Extent(), aFZs.Extent(), + aZZs.Extent(), }; // bSelfInt = Standard_False; ind = 0; - for (aTypeInt = 0; aTypeInt < 6; ++aTypeInt) { + for (aTypeInt = 0; aTypeInt < aNbInterfTypes; ++aTypeInt) { + for (i = 0; i < aNb[aTypeInt]; ++i) { - BOPDS_Interf* aInt = - (aTypeInt==0) ? (BOPDS_Interf*)(&aVVs(i)) : - ((aTypeInt==1) ? (BOPDS_Interf*)(&aVEs(i)) : - ((aTypeInt==2) ? (BOPDS_Interf*)(&aEEs(i)) : - ((aTypeInt==3) ? (BOPDS_Interf*)(&aVFs(i)) : - ((aTypeInt==4) ? (BOPDS_Interf*)(&aEFs(i)) : - (BOPDS_Interf*)(&aFFs(i)))))); + BOPDS_Interf* aInt=NULL; + // + switch(aTypeInt) { + case 0: + aInt=(BOPDS_Interf*)(&aVVs(i)); + break; + case 1: + aInt=(BOPDS_Interf*)(&aVEs(i)); + break; + case 2: + aInt=(BOPDS_Interf*)(&aEEs(i)); + break; + case 3: + aInt=(BOPDS_Interf*)(&aVFs(i)); + break; + case 4: + aInt=(BOPDS_Interf*)(&aEFs(i)); + break; + case 5: + aInt=(BOPDS_Interf*)(&aFFs(i)); + break; + case 6: + aInt=(BOPDS_Interf*)(&aVZs(i)); + break; + case 7: + aInt=(BOPDS_Interf*)(&aEZs(i)); + break; + case 8: + aInt=(BOPDS_Interf*)(&aFZs(i)); + break; + case 9: + aInt=(BOPDS_Interf*)(&aZZs(i)); + break; + default: + break; + } // nI1 = aInt->Index1(); nI2 = aInt->Index2(); @@ -157,6 +216,10 @@ Standard_Integer bopcheck continue; } // + if(theDS->IsNewShape(nI1) || theDS->IsNewShape(nI2)) { + continue; + } + // if (aTypeInt == 4) { BOPDS_InterfEF& aEF=aEFs(i); if (aEF.CommonPart().Type()==TopAbs_SHAPE) { diff --git a/tests/bugs/modalg_5/bug24764 b/tests/bugs/modalg_5/bug24764 new file mode 100755 index 0000000000..0c622eaa1f --- /dev/null +++ b/tests/bugs/modalg_5/bug24764 @@ -0,0 +1,32 @@ +puts "================" +puts "OCC24764" +puts "================" +puts "" +####################################################################################### +# Alien subshapes occured in result of 'bopcheck' operation +###################################################################################### + +restore [locate_data_file bug24764_qa.brep] a + +bopcheck a 4 + +set N 16 +set qz {} + +lappend qz a +for {set i 0} {$i < $N} {incr i} { + lappend qz x${i} +} +eval compound $qz result + +set nb_v_good 24 +set nb_e_good 24 +set nb_w_good 2 +set nb_f_good 1 +set nb_sh_good 0 +set nb_sol_good 0 +set nb_compsol_good 0 +set nb_compound_good 2 +set nb_shape_good 53 + +set 2dviewer 1