From c884a2681d0d7693b200f406cc6fa7ae857d8822 Mon Sep 17 00:00:00 2001 From: emv Date: Thu, 26 Sep 2013 17:16:19 +0400 Subject: [PATCH] 0024187: Wrong result of COMMON operation. In the function void BOPAlgo_Builder::FillInternalShapes() added treatment for the arguments of type COMPOUND. Adding test case for issue CR24187 --- src/BOPAlgo/BOPAlgo_Builder_3.cxx | 42 +++++++++++++++++++++++++++---- tests/bugs/modalg_5/bug24187 | 33 ++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 5 deletions(-) create mode 100644 tests/bugs/modalg_5/bug24187 diff --git a/src/BOPAlgo/BOPAlgo_Builder_3.cxx b/src/BOPAlgo/BOPAlgo_Builder_3.cxx index 44d244111a..eea47605b7 100644 --- a/src/BOPAlgo/BOPAlgo_Builder_3.cxx +++ b/src/BOPAlgo/BOPAlgo_Builder_3.cxx @@ -76,6 +76,11 @@ static void OwnInternalShapes(const TopoDS_Shape& , BOPCol_IndexedMapOfShape& ); +static + void TreatCompound(const TopoDS_Shape& theS, + BOPCol_MapOfShape& aMFence, + BOPCol_ListOfShape& theLS); + //======================================================================= //class : BOPAlgo_ShapeBox //purpose : Auxiliary class @@ -618,6 +623,7 @@ void BOPAlgo_Builder::FillInternalShapes() BOPCol_MapOfShape aMSOr(100, aAllocator); BOPCol_ListOfShape aLSd(aAllocator); BOPCol_ListOfShape aLArgs(aAllocator); + BOPCol_ListOfShape aLSC(aAllocator); // // 1. Shapes to process // @@ -627,10 +633,11 @@ void BOPAlgo_Builder::FillInternalShapes() aIt.Initialize(myArguments); for (; aIt.More(); aIt.Next()) { const TopoDS_Shape& aS=aIt.Value(); - if (!aMFence.Add(aS)) { - continue; - } - // + TreatCompound(aS, aMFence, aLSC); + } + aIt.Initialize(aLSC); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aS=aIt.Value(); aType=aS.ShapeType(); if (aType==TopAbs_WIRE) { aItS.Initialize(aS); @@ -947,7 +954,32 @@ Standard_Boolean IsClosedShell(const TopoDS_Shell& aSh) // return bRet; } - +//======================================================================= +//function : TreatCompound +//purpose : +//======================================================================= +void TreatCompound(const TopoDS_Shape& theS, + BOPCol_MapOfShape& aMFence, + BOPCol_ListOfShape& theLS) +{ + TopAbs_ShapeEnum aType; + // + aType = theS.ShapeType(); + if (aType != TopAbs_COMPOUND) { + if (aMFence.Add(theS)) { + theLS.Append(theS); + } + return; + } + // + TopoDS_Iterator aIt; + // + aIt.Initialize(theS); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aS = aIt.Value(); + TreatCompound(aS, aMFence, theLS); + } +} // // ErrorStatus diff --git a/tests/bugs/modalg_5/bug24187 b/tests/bugs/modalg_5/bug24187 new file mode 100644 index 0000000000..54c9077834 --- /dev/null +++ b/tests/bugs/modalg_5/bug24187 @@ -0,0 +1,33 @@ +puts "============" +puts "OCC24187" +puts "============" +puts "" +############################################################################################### +# Wrong result of COMMON operation +############################################################################################### + +box b1 10 10 10 + +circle c1 -3 5 2 5 +circle c2 -3 5 8 5 +mkedge e1 c1 +mkedge e2 c2 +compound e1 e2 b2 + +bop b1 b2 +bopcommon result + +set length 18.5459 + +# Analysis of "nbshapes result" +set nb_v_good 6 +set nb_e_good 4 +set nb_w_good 2 +set nb_f_good 0 +set nb_sh_good 0 +set nb_sol_good 0 +set nb_compsol_good 0 +set nb_compound_good 1 +set nb_shape_good 13 + +set 2dviewer 1