X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FBlockFix%2FBlockFix_BlockFixAPI.cxx;h=1990d3ad04cc133102d613a87cb0397aebe0250d;hb=8db1e932e38aeeebef835d9e87b1e8781f55f821;hp=c6d6d32219f750bc901ce2b0b53aae91817cf3ae;hpb=40d76807e945ceef6a730f4d0177e167d3ccb453;p=modules%2Fgeom.git diff --git a/src/BlockFix/BlockFix_BlockFixAPI.cxx b/src/BlockFix/BlockFix_BlockFixAPI.cxx index c6d6d3221..1990d3ad0 100644 --- a/src/BlockFix/BlockFix_BlockFixAPI.cxx +++ b/src/BlockFix/BlockFix_BlockFixAPI.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2021 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 @@ -31,10 +31,12 @@ #include #include +#include +#include #include -IMPLEMENT_STANDARD_RTTIEXT(BlockFix_BlockFixAPI, Standard_Transient); +IMPLEMENT_STANDARD_RTTIEXT(BlockFix_BlockFixAPI, Standard_Transient) //======================================================================= //function : BlockFix_BlockFixAPI @@ -67,10 +69,31 @@ void BlockFix_BlockFixAPI::Perform() myShape = BlockFix::RefillProblemFaces(myShape); // faces unification - BlockFix_UnionFaces aFaceUnifier; - aFaceUnifier.GetTolerance() = myTolerance; - aFaceUnifier.GetOptimumNbFaces() = myOptimumNbFaces; - TopoDS_Shape aResult = aFaceUnifier.Perform(myShape); + TopoDS_Shape aResult = myShape; + if (myOptimumNbFaces > 1) { + // use old algo BlockFix_UnionFaces for exactly given resulting number of faces + BlockFix_UnionFaces aFaceUnifier; + aFaceUnifier.GetTolerance() = myTolerance; + aFaceUnifier.GetOptimumNbFaces() = myOptimumNbFaces; + aResult = aFaceUnifier.Perform(aResult); + } + else if (myOptimumNbFaces != -1) { + // use OCCT algo ShapeUpgrade_UnifySameDomain + ShapeUpgrade_UnifySameDomain Unifier; + //only faces + Standard_Boolean isUnifyEdges = Standard_False; + Standard_Boolean isUnifyFaces = Standard_True; + Standard_Boolean isConcatBSplines = Standard_True; + Unifier.Initialize(myShape, isUnifyEdges, isUnifyFaces, isConcatBSplines); + //Unifier.SetLinearTolerance(myTolerance); + Unifier.SetLinearTolerance(Precision::Confusion()); + Unifier.SetAngularTolerance(Precision::Confusion()); + Unifier.Build(); + aResult = Unifier.Shape(); + } + else { + // myOptimumNbFaces == -1 means do not union faces + } // avoid problem with degenerated edges appearance // due to shape quality regress @@ -79,8 +102,16 @@ void BlockFix_BlockFixAPI::Perform() aResult = RemLoc.GetResult(); // edges unification - BlockFix_UnionEdges anEdgeUnifier; - myShape = anEdgeUnifier.Perform(aResult,myTolerance); + //BlockFix_UnionEdges anEdgeUnifier; + //myShape = anEdgeUnifier.Perform(aResult,myTolerance); + ShapeUpgrade_UnifySameDomain Unifier; + Standard_Boolean isUnifyEdges = Standard_True; + Standard_Boolean isUnifyFaces = Standard_False; //only edges + Standard_Boolean isConcatBSplines = Standard_True; + Unifier.Initialize(aResult, isUnifyEdges, isUnifyFaces, isConcatBSplines); + Unifier.SetLinearTolerance(myTolerance); + Unifier.Build(); + myShape = Unifier.Shape(); TopoDS_Shape aRes = BlockFix::FixRanges(myShape,myTolerance); myShape = aRes;