X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOMImpl%2FGEOMImpl_Block6Explorer.cxx;h=48f179cf8e71c41dd49f0c959f1895ef57c65fc8;hb=1c97ae08b2a06f98e1aad293b86819574c150264;hp=db47bb49a2bac596228c7bbc001e09e49590d198;hpb=afe8b139b090bcf9b7d7be49b4937906887837b4;p=modules%2Fgeom.git diff --git a/src/GEOMImpl/GEOMImpl_Block6Explorer.cxx b/src/GEOMImpl/GEOMImpl_Block6Explorer.cxx index db47bb49a..48f179cf8 100644 --- a/src/GEOMImpl/GEOMImpl_Block6Explorer.cxx +++ b/src/GEOMImpl/GEOMImpl_Block6Explorer.cxx @@ -1,24 +1,24 @@ -// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE // -// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS // -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. // -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. // -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com + #include #include @@ -61,8 +61,11 @@ #include #include +#include + #include #include +#include #include #include @@ -75,6 +78,8 @@ #define NBEDGES 12 #define NBVERTS 8 +#define PLANAR_FACE_MAX_TOLERANCE 1e-06 + static Standard_Integer mod4 (Standard_Integer nb) { if (nb <= 0) return nb + 4; @@ -987,15 +992,15 @@ void GEOMImpl_Block6Explorer::InitByTwoFaces (const TopoDS_Shape& theFace1, TopoDS_Wire wire1 = TopoDS::Wire(aWire1); TopoDS_Wire wire2 = TopoDS::Wire(aWire2); TopoDS_Vertex aV1, aV2; - + TopExp::Vertices(wire1, aV1, aV2); if ( !aV1.IsNull() && !aV2.IsNull() && aV1.IsSame(aV2) ) aWire1.Closed( true ); - + TopExp::Vertices(wire2, aV1, aV2); if ( !aV1.IsNull() && !aV2.IsNull() && aV1.IsSame(aV2) ) aWire2.Closed( true ); - + // 4. Generate side surface if (!aWire1.Closed() || !aWire2.Closed()) { // BRepOffsetAPI_ThruSections is not applicable on not closed wires @@ -1193,15 +1198,76 @@ Standard_Integer GEOMImpl_Block6Explorer::FindFace //function : MakeFace //purpose : //======================================================================= -void GEOMImpl_Block6Explorer::MakeFace (const TopoDS_Wire& theWire, - const Standard_Boolean isPlanarWanted, - TopoDS_Shape& theResult) +TCollection_AsciiString GEOMImpl_Block6Explorer::MakeFace (const TopoDS_Wire& theWire, + const Standard_Boolean isPlanarWanted, + TopoDS_Shape& theResult) { - // try to build face on plane or on any surface under the edges of the wire - BRepBuilderAPI_MakeFace MK (theWire, isPlanarWanted); - if (MK.IsDone()) { - theResult = MK.Shape(); - return; + TCollection_AsciiString aWarning; + + // Workaround for Mantis issue 0020956 + if (isPlanarWanted) { + // Count the number of points in the wire. + // Collect the first three points. + gp_Pnt p1, p2, p3; + bool is3Pnts(false); + bool p1set(false), p2set(false), p3set(false); + BRepTools_WireExplorer wexpl(theWire); + for (; wexpl.More(); wexpl.Next()) { + if (!p1set) { + p1set = true; + p1 = BRep_Tool::Pnt(wexpl.CurrentVertex()); + } + else if (!p2set) { + p2set = true; + p2 = BRep_Tool::Pnt(wexpl.CurrentVertex()); + } + else if (!p3set) { + p3set = true; + is3Pnts = true; + p3 = BRep_Tool::Pnt(wexpl.CurrentVertex()); + } + else { + is3Pnts = false; + break; + } + } + + // Construct a plane for the case of three points in the wire. + gp_Pln plane; + if (is3Pnts) { + gce_MakePln mkPln(p1, p2, p3); + if (mkPln.IsDone()) { + plane = mkPln.Value(); + } + else { + is3Pnts = false; + } + } + + // Construct a face based on the plane (in case of three points in the wire) or + // allow MakeFace to build the plane itself (in case of the number of points is greater than 3). + if (is3Pnts) { + BRepBuilderAPI_MakeFace MK (plane, theWire, isPlanarWanted); + if (MK.IsDone()) { + theResult = MK.Shape(); + return aWarning; + } + } + else { + BRepBuilderAPI_MakeFace MK (theWire, isPlanarWanted); + if (MK.IsDone()) { + theResult = MK.Shape(); + return aWarning; + } + } + } + else { + // try to build face on plane or on any surface under the edges of the wire + BRepBuilderAPI_MakeFace MK (theWire, isPlanarWanted); + if (MK.IsDone()) { + theResult = MK.Shape(); + return aWarning; + } } if (!isPlanarWanted) { @@ -1283,7 +1349,7 @@ void GEOMImpl_Block6Explorer::MakeFace (const TopoDS_Wire& theWire, if (!aFS.Found()) { aFS.Init(theWire, aToleranceReached, isPlanarWanted); - if (!aFS.Found()) return; + if (!aFS.Found()) return aWarning; aToleranceReached = aFS.ToleranceReached(); aTol = aFS.Tolerance(); } @@ -1291,7 +1357,7 @@ void GEOMImpl_Block6Explorer::MakeFace (const TopoDS_Wire& theWire, // Copy the wire, bacause it can be updated with very-very big tolerance here BRepBuilderAPI_Copy aMC (theWire); - if (!aMC.IsDone()) return; + if (!aMC.IsDone()) return aWarning; TopoDS_Wire aWire = TopoDS::Wire(aMC.Shape()); // Update tolerances to BRep_Builder B; @@ -1308,7 +1374,9 @@ void GEOMImpl_Block6Explorer::MakeFace (const TopoDS_Wire& theWire, BRepBuilderAPI_MakeFace MK1 (aWire, isPlanarWanted); if (MK1.IsDone()) { theResult = MK1.Shape(); - return; + if (aTol > PLANAR_FACE_MAX_TOLERANCE) + aWarning = "MAKE_FACE_TOLERANCE_TOO_BIG"; + return aWarning; } #else // After migration on OCCT version, containing PKV's fix. See bug 8293 @@ -1316,8 +1384,10 @@ void GEOMImpl_Block6Explorer::MakeFace (const TopoDS_Wire& theWire, aBMF.Init(theWire, isPlanarWanted, Standard_True); if (aBMF.Error() == BRepLib_FaceDone) { theResult = aBMF.Shape(); - return; + return aWarning; } #endif } + + return aWarning; }