- 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
+ }