X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOMImpl%2FGEOMImpl_BooleanDriver.cxx;h=1449a1112b17800e33de8d6853f9bd3ede9c6adf;hb=2e77f1c4451dd5a9329677b9b4eb90b9ce9e653d;hp=045ca5adefe439103554e748404f79a9f5cfd99d;hpb=6f6b0b4c18597ee72a30494cd98bd10c1a5d40ad;p=modules%2Fgeom.git diff --git a/src/GEOMImpl/GEOMImpl_BooleanDriver.cxx b/src/GEOMImpl/GEOMImpl_BooleanDriver.cxx index 045ca5ade..1449a1112 100644 --- a/src/GEOMImpl/GEOMImpl_BooleanDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_BooleanDriver.cxx @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -231,6 +232,83 @@ Standard_Integer GEOMImpl_BooleanDriver::Execute(TFunction_Logbook& log) const // perform FUSE operation else if (aType == BOOLEAN_FUSE) { + /* Fix for NPAL15379: refused + // Check arguments + TopTools_ListOfShape listShape1, listShape2; + AddSimpleShapes(aShape1, listShape1); + AddSimpleShapes(aShape2, listShape2); + + Standard_Boolean isIntersect = Standard_False; + + if (listShape1.Extent() > 1 && !isIntersect) { + // check intersections inside the first compound + TopTools_ListIteratorOfListOfShape it1 (listShape1); + for (; it1.More() && !isIntersect; it1.Next()) { + TopoDS_Shape aValue1 = it1.Value(); + TopTools_ListIteratorOfListOfShape it2 (listShape1); + for (; it2.More() && !isIntersect; it2.Next()) { + TopoDS_Shape aValue2 = it2.Value(); + if (aValue2 != aValue1) { + BRepAlgoAPI_Section BO (aValue1, aValue2); + if (BO.IsDone()) { + TopoDS_Shape aSect = BO.Shape(); + TopExp_Explorer anExp (aSect, TopAbs_EDGE); + if (anExp.More()) { + isIntersect = Standard_True; + } + } + } + } + } + } + + if (listShape2.Extent() > 1 && !isIntersect) { + // check intersections inside the second compound + TopTools_ListIteratorOfListOfShape it1 (listShape2); + for (; it1.More() && !isIntersect; it1.Next()) { + TopoDS_Shape aValue1 = it1.Value(); + TopTools_ListIteratorOfListOfShape it2 (listShape2); + for (; it2.More() && !isIntersect; it2.Next()) { + TopoDS_Shape aValue2 = it2.Value(); + if (aValue2 != aValue1) { + BRepAlgoAPI_Section BO (aValue1, aValue2); + if (BO.IsDone()) { + TopoDS_Shape aSect = BO.Shape(); + TopExp_Explorer anExp (aSect, TopAbs_EDGE); + if (anExp.More()) { + isIntersect = Standard_True; + } + } + } + } + } + } + + if (isIntersect) { + // have intersections inside compounds + // check intersections between compounds + TopTools_ListIteratorOfListOfShape it1 (listShape1); + for (; it1.More(); it1.Next()) { + TopoDS_Shape aValue1 = it1.Value(); + TopTools_ListIteratorOfListOfShape it2 (listShape2); + for (; it2.More(); it2.Next()) { + TopoDS_Shape aValue2 = it2.Value(); + if (aValue2 != aValue1) { + BRepAlgoAPI_Section BO (aValue1, aValue2); + if (BO.IsDone()) { + TopoDS_Shape aSect = BO.Shape(); + TopExp_Explorer anExp (aSect, TopAbs_EDGE); + if (anExp.More()) { + StdFail_NotDone::Raise("Bad argument for Fuse: compound with intersecting sub-shapes"); + } + } + } + } + } + } + */ + + // Perform BRepAlgoAPI_Fuse BO (aShape1, aShape2); if (!BO.IsDone()) { StdFail_NotDone::Raise("Fuse operation can not be performed on the given shapes"); @@ -257,7 +335,13 @@ Standard_Integer GEOMImpl_BooleanDriver::Execute(TFunction_Logbook& log) const TopTools_ListIteratorOfListOfShape itSub2 (listShape2); for (; itSub2.More(); itSub2.Next()) { TopoDS_Shape aValue2 = itSub2.Value(); - BRepAlgoAPI_Section BO (aValue1, aValue2); + BRepAlgoAPI_Section BO (aValue1, aValue2, Standard_False); + // Set approximation to have an attached 3D BSpline geometry to each edge, + // where analytic curve is not possible. Without this flag in some cases + // we obtain BSpline curve of degree 1 (C0), which is slowly + // processed by some algorithms (Partition for example). + BO.Approximation(Standard_True); + BO.Build(); if (!BO.IsDone()) { StdFail_NotDone::Raise("Section operation can not be performed on the given shapes"); }