Salome HOME
Usage of ShapeUpgrade_UnifySameDomain instead of BlockFix_UnionFaces and BlockFix_Uni...
[modules/geom.git] / src / BlockFix / BlockFix_BlockFixAPI.cxx
index c6d6d32219f750bc901ce2b0b53aae91817cf3ae..1990d3ad04cc133102d613a87cb0397aebe0250d 100644 (file)
@@ -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
 #include <BlockFix_UnionEdges.hxx>
 
 #include <ShapeUpgrade_RemoveLocations.hxx>
+#include <TopoDS_Edge.hxx>
+#include <ShapeUpgrade_UnifySameDomain.hxx>
 
 #include <Precision.hxx>
 
-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;