From fc58f61296564ed051733423359e2a55eef4b403 Mon Sep 17 00:00:00 2001 From: vsr Date: Mon, 8 Dec 2014 11:57:28 +0300 Subject: [PATCH] 0022743: EDF GEOM: Regression in MakePipeTShapeChamfer: Some faces are missing in a GetShapesOnCylinder result --- src/GEOMImpl/GEOMImpl_FilletDriver.cxx | 42 ++++++++++++++------ src/GEOMImpl/GEOMImpl_HealingDriver.cxx | 5 ++- src/GEOMImpl/GEOMImpl_IHealing.hxx | 9 ++++- src/GEOMImpl/GEOMImpl_IHealingOperations.cxx | 4 +- src/GEOMImpl/GEOMImpl_IHealingOperations.hxx | 4 +- 5 files changed, 46 insertions(+), 18 deletions(-) diff --git a/src/GEOMImpl/GEOMImpl_FilletDriver.cxx b/src/GEOMImpl/GEOMImpl_FilletDriver.cxx index 33e942e79..f8b6756a0 100644 --- a/src/GEOMImpl/GEOMImpl_FilletDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_FilletDriver.cxx @@ -45,6 +45,26 @@ #include #include +// VSR 08/12/2014: debug PipeTShape function +// Uncomment the macro below to correct tolerance of resulting face after creating fillet +#define FIX_FACE_TOLERANCE + +namespace +{ + bool FixShape( TopoDS_Shape& shape, + TopAbs_ShapeEnum type = TopAbs_SHAPE, + Standard_Real tolerance = Precision::Confusion() ) + { + ShapeFix_ShapeTolerance aSFT; + aSFT.LimitTolerance( shape, tolerance, tolerance, type ); + Handle(ShapeFix_Shape) aSfs = new ShapeFix_Shape( shape ); + aSfs->Perform(); + shape = aSfs->Shape(); + BRepCheck_Analyzer ana( shape, false ); + return ana.IsValid(); + } +} + //======================================================================= //function : GetID //purpose : @@ -135,20 +155,16 @@ Standard_Integer GEOMImpl_FilletDriver::Execute(TFunction_Logbook& log) const if (aShape.IsNull()) return 0; +#ifdef FIX_FACE_TOLERANCE + bool isOk = FixShape(aShape, TopAbs_FACE); +#else // Check shape validity - BRepCheck_Analyzer ana (aShape, false); - if (!ana.IsValid()) { - // 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"); - } + BRepCheck_Analyzer ana(aShape, false); + // 08.07.2008 added by skl during fixing bug 19761 from Mantis + bool isOk = ana.IsValid() || FixShape(aShape); +#endif + if ( !isOk ) + StdFail_NotDone::Raise("Fillet algorithm have produced an invalid shape result"); aFunction->SetValue(aShape); diff --git a/src/GEOMImpl/GEOMImpl_HealingDriver.cxx b/src/GEOMImpl/GEOMImpl_HealingDriver.cxx index 09441ab23..89decb61c 100644 --- a/src/GEOMImpl/GEOMImpl_HealingDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_HealingDriver.cxx @@ -541,6 +541,8 @@ void GEOMImpl_HealingDriver::LimitTolerance (GEOMImpl_IHealing* theHI, TopoDS_Shape& theOutShape) const { Standard_Real aTol = theHI->GetTolerance(); + TopAbs_ShapeEnum aType = theHI->GetType(); + if (aTol < Precision::Confusion()) aTol = Precision::Confusion(); @@ -551,7 +553,7 @@ void GEOMImpl_HealingDriver::LimitTolerance (GEOMImpl_IHealing* theHI, // 2. Limit tolerance. ShapeFix_ShapeTolerance aSFT; - aSFT.LimitTolerance(aShapeCopy, aTol, aTol, TopAbs_SHAPE); + aSFT.LimitTolerance(aShapeCopy, aTol, aTol, aType); // 3. Fix obtained shape. Handle(ShapeFix_Shape) aSfs = new ShapeFix_Shape (aShapeCopy); @@ -902,6 +904,7 @@ GetCreationInformation(std::string& theOperationName, theOperationName = "LIMIT_TOLERANCE"; AddParam( theParams, "Selected shape", aCI.GetOriginal() ); AddParam( theParams, "Tolerance", aCI.GetTolerance() ); + AddParam( theParams, "Type", aCI.GetType() ); break; case FUSE_COLLINEAR_EDGES: theOperationName = "FUSE_EDGES"; diff --git a/src/GEOMImpl/GEOMImpl_IHealing.hxx b/src/GEOMImpl/GEOMImpl_IHealing.hxx index 8fcbf3110..4324a6662 100755 --- a/src/GEOMImpl/GEOMImpl_IHealing.hxx +++ b/src/GEOMImpl/GEOMImpl_IHealing.hxx @@ -24,7 +24,8 @@ #include #include -#include "TColStd_HSequenceOfTransient.hxx" +#include +#include class GEOMImpl_IHealing { @@ -41,7 +42,8 @@ public: ARG_DEV_EDGE_VALUE = 8, ARG_IS_BY_PARAMETER = 9, ARG_SUBSHAPE_INDEX = 10, - ARG_LIST_SHAPES = 11 + ARG_LIST_SHAPES = 11, + ARG_TYPE = 12 }; GEOMImpl_IHealing(Handle(GEOM_Function) theFunction): _func(theFunction) {} @@ -73,6 +75,9 @@ public: void SetTolerance( Standard_Real val ) { _func->SetReal(ARG_TOLERANCE, val); } Standard_Real GetTolerance() { return _func->GetReal(ARG_TOLERANCE); } + void SetType( TopAbs_ShapeEnum val ) { _func->SetInteger(ARG_TYPE, (Standard_Integer)val); } + TopAbs_ShapeEnum GetType() { TopAbs_ShapeEnum type = (TopAbs_ShapeEnum)(_func->GetInteger(ARG_TYPE)); return _func->IsDone() ? type : TopAbs_SHAPE; } + void SetDevideEdgeValue( Standard_Real val ) { _func->SetReal(ARG_DEV_EDGE_VALUE, val); } Standard_Real GetDevideEdgeValue() { return _func->GetReal(ARG_DEV_EDGE_VALUE); } diff --git a/src/GEOMImpl/GEOMImpl_IHealingOperations.cxx b/src/GEOMImpl/GEOMImpl_IHealingOperations.cxx index b45374c45..443ae83d6 100644 --- a/src/GEOMImpl/GEOMImpl_IHealingOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IHealingOperations.cxx @@ -1056,7 +1056,8 @@ Handle(GEOM_Object) GEOMImpl_IHealingOperations::ChangeOrientationCopy (Handle(G */ //============================================================================= Handle(GEOM_Object) GEOMImpl_IHealingOperations::LimitTolerance (Handle(GEOM_Object) theObject, - double theTolerance) + double theTolerance, + TopAbs_ShapeEnum theType) { // Set error code, check parameters SetErrorCode(KO); @@ -1084,6 +1085,7 @@ Handle(GEOM_Object) GEOMImpl_IHealingOperations::LimitTolerance (Handle(GEOM_Obj GEOMImpl_IHealing HI (aFunction); HI.SetOriginal(aLastFunction); HI.SetTolerance(theTolerance); + HI.SetType(theType); // Compute try { diff --git a/src/GEOMImpl/GEOMImpl_IHealingOperations.hxx b/src/GEOMImpl/GEOMImpl_IHealingOperations.hxx index 607ecc4b4..77c9fa392 100644 --- a/src/GEOMImpl/GEOMImpl_IHealingOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_IHealingOperations.hxx @@ -27,6 +27,7 @@ #include "GEOM_Engine.hxx" #include "GEOM_Object.hxx" +#include #include #include @@ -96,7 +97,8 @@ class GEOMImpl_IHealingOperations : public GEOM_IOperations { Standard_EXPORT Handle(GEOM_Object) ChangeOrientationCopy( Handle(GEOM_Object) theObject); Standard_EXPORT Handle(GEOM_Object) LimitTolerance( Handle(GEOM_Object) theObject, - double theTolerance ); + double theTolerance, + TopAbs_ShapeEnum theType = TopAbs_SHAPE ); };