X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOMImpl%2FGEOMImpl_FilletDriver.cxx;h=93ed1eafddba8ff424de4c93b0b5db839819492d;hb=5d0c88cda62b6c3255cba94a3a961d18e7aed0d9;hp=78a6df18633afd14c8c3aff1ea10ea6eebdf9dda;hpb=d3dd282390888d7dc091ba2c2ffe7923bd7458e6;p=modules%2Fgeom.git diff --git a/src/GEOMImpl/GEOMImpl_FilletDriver.cxx b/src/GEOMImpl/GEOMImpl_FilletDriver.cxx index 78a6df186..93ed1eafd 100644 --- a/src/GEOMImpl/GEOMImpl_FilletDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_FilletDriver.cxx @@ -1,10 +1,32 @@ - -using namespace std; -#include "GEOMImpl_FilletDriver.hxx" -#include "GEOMImpl_IFillet.hxx" -#include "GEOMImpl_Types.hxx" -#include "GEOMImpl_ILocalOperations.hxx" -#include "GEOM_Function.hxx" +// 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 +// +// 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. +// +// 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 +#include +#include +#include +#include #include #include @@ -16,6 +38,9 @@ using namespace std; #include #include +#include +#include + #include #include #include @@ -63,17 +88,17 @@ Standard_Integer GEOMImpl_FilletDriver::Execute(TFunction_Logbook& log) const TopoDS_Edge E = TopoDS::Edge(Exp.Current()); fill.Add(E); } - } else if (aType == FILLET_SHAPE_EDGES) { + } else if (aType == FILLET_SHAPE_EDGES || aType == FILLET_SHAPE_EDGES_2R) { int aLen = aCI.GetLength(); int ind = 1; for (; ind <= aLen; ind++) { TopoDS_Shape aShapeEdge; if (GEOMImpl_ILocalOperations::GetSubShape (aShapeBase, aCI.GetEdge(ind), aShapeEdge)) { - fill.Add(TopoDS::Edge(aShapeEdge)); + fill.Add(TopoDS::Edge(aShapeEdge)); } } - } else if (aType == FILLET_SHAPE_FACES) { + } else if (aType == FILLET_SHAPE_FACES || aType == FILLET_SHAPE_FACES_2R) { int aLen = aCI.GetLength(); int ind = 1; for (; ind <= aLen; ind++) { @@ -88,10 +113,15 @@ Standard_Integer GEOMImpl_FilletDriver::Execute(TFunction_Logbook& log) const } } else { } + if (aType == FILLET_SHAPE_FACES || aType == FILLET_SHAPE_EDGES || aType == FILLET_SHAPE_ALL) + for (int i = 1; i <= fill.NbContours(); i++) + fill.SetRadius(aCI.GetR(), i, 1); + else if (aType == FILLET_SHAPE_FACES_2R || aType == FILLET_SHAPE_EDGES_2R) + for (int i = 1; i <= fill.NbContours(); i++) + { + fill.SetRadius(aCI.GetR1(), aCI.GetR2(), i, 1); + } - for (int i = 1; i <= fill.NbContours(); i++) { - fill.SetRadius(aCI.GetR(), i, i); - } fill.Build(); if (!fill.IsDone()) { StdFail_NotDone::Raise("Fillet can't be computed on the given shape with the given radius"); @@ -103,7 +133,16 @@ Standard_Integer GEOMImpl_FilletDriver::Execute(TFunction_Logbook& log) const // Check shape validity BRepCheck_Analyzer ana (aShape, false); if (!ana.IsValid()) { - StdFail_NotDone::Raise("Fillet algorithm have produced an invalid shape result"); + // 08.07.2008 added by skl during fixing bug 19761 from Mantis + ShapeFix_ShapeTolerance aSFT; + aSFT.LimitTolerance(aShape, Precision::Confusion(), + Precision::Confusion(), TopAbs_SHAPE); + Handle(ShapeFix_Shape) aSfs = new ShapeFix_Shape(aShape); + aSfs->Perform(); + aShape = aSfs->Shape(); + ana.Init(aShape); + if (!ana.IsValid()) + StdFail_NotDone::Raise("Fillet algorithm have produced an invalid shape result"); } aFunction->SetValue(aShape); @@ -131,10 +170,10 @@ Standard_EXPORT Handle_Standard_Type& GEOMImpl_FilletDriver_Type_() static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_FilletDriver", - sizeof(GEOMImpl_FilletDriver), - 1, - (Standard_Address)_Ancestors, - (Standard_Address)NULL); + sizeof(GEOMImpl_FilletDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); return _aType; }