mirror of
https://git.salome-platform.org/gitpub/modules/geom.git
synced 2024-12-27 09:50:34 +05:00
0022706: EDF GEOM: Regression in T-shape pipe primitive with fillet: HexMesh option induces an error
Fix #1: upgrade tolerances of pcurves as they can be invalid after ShHealOper_ShapeProcess
This commit is contained in:
parent
2f881b9544
commit
5b5f4d6982
@ -83,6 +83,27 @@
|
|||||||
|
|
||||||
#define PLANAR_FACE_MAX_TOLERANCE 1e-06
|
#define PLANAR_FACE_MAX_TOLERANCE 1e-06
|
||||||
|
|
||||||
|
// The following macro, when enabled, causes pcurves upgrade after MakeFilling algorithm
|
||||||
|
// in MakeAnyFace function;
|
||||||
|
// WARNING: it may lead to extra vertices generation by partition algorithm
|
||||||
|
// in some cases, for example when fillet is made on a PipeTShape -
|
||||||
|
// see issues 0021568 and 0021550
|
||||||
|
// VSR (15/05/2012): macro commented out (disabled) to avoid extra vertices!
|
||||||
|
//#define MAKE_FACE_UPGRADE_PCURVES
|
||||||
|
|
||||||
|
// The following macro, when enabled, causes fixing tolerance for pcurves
|
||||||
|
// after BRepBuilderAPI_MakeFace + ShHealOper_ShapeProcess in MakeAnyFace function;
|
||||||
|
// This sometimes allows to fix problems of extra vertices generation
|
||||||
|
// see issue 0022706
|
||||||
|
// VSR (17/11/2014): macro enabled
|
||||||
|
#define MAKE_FACE_PCURVES_FIX_TOLERANCE
|
||||||
|
|
||||||
|
#ifdef MAKE_FACE_PCURVES_FIX_TOLERANCE
|
||||||
|
#include <BOPTools_AlgoTools.hxx>
|
||||||
|
#include <NCollection_DataMap.hxx>
|
||||||
|
#include <ShapeFix_ShapeTolerance.hxx>
|
||||||
|
#endif
|
||||||
|
|
||||||
static Standard_Integer mod4 (Standard_Integer nb)
|
static Standard_Integer mod4 (Standard_Integer nb)
|
||||||
{
|
{
|
||||||
if (nb <= 0) return nb + 4;
|
if (nb <= 0) return nb + 4;
|
||||||
@ -1362,11 +1383,7 @@ TCollection_AsciiString GEOMImpl_Block6Explorer::MakeAnyFace (const TopoDS_Wire&
|
|||||||
// 12.04.2006 for PAL12149 begin
|
// 12.04.2006 for PAL12149 begin
|
||||||
Handle(Geom_Surface) aGS = BRep_Tool::Surface(TopoDS::Face(aFace));
|
Handle(Geom_Surface) aGS = BRep_Tool::Surface(TopoDS::Face(aFace));
|
||||||
|
|
||||||
// VSR: debug issues 0021568 and 0021550 (15/05/2012) - BEGIN
|
#ifdef MAKE_FACE_UPGRADE_PCURVES
|
||||||
// the following block, when enabled, leads to extra vertices generation by partition algorithm
|
|
||||||
// in some cases, for example when fillet is made on a PipeTShape
|
|
||||||
#if 0
|
|
||||||
// VSR: debug issues 0021568 and 0021550 (15/05/2012) - END
|
|
||||||
BRep_Builder BB;
|
BRep_Builder BB;
|
||||||
TopoDS_Iterator itw(theWire);
|
TopoDS_Iterator itw(theWire);
|
||||||
for (; itw.More(); itw.Next())
|
for (; itw.More(); itw.Next())
|
||||||
@ -1396,7 +1413,44 @@ TCollection_AsciiString GEOMImpl_Block6Explorer::MakeAnyFace (const TopoDS_Wire&
|
|||||||
}
|
}
|
||||||
// 12.04.2006 for PAL12149 end
|
// 12.04.2006 for PAL12149 end
|
||||||
|
|
||||||
if (theResult.IsNull()) { // try to deal with pure result of filling
|
if (!theResult.IsNull()) {
|
||||||
|
// try to deal with result of BRepBuilderAPI_MakeFace + ShHealOper_ShapeProcess
|
||||||
|
#ifdef MAKE_FACE_PCURVES_FIX_TOLERANCE
|
||||||
|
// check and fix pcurves, if necessary
|
||||||
|
Standard_Real aT, aTolE, aD, aDMax;
|
||||||
|
TopExp_Explorer aExpF, aExpE;
|
||||||
|
NCollection_DataMap<TopoDS_Shape, Standard_Real, TopTools_ShapeMapHasher> aDMETol;
|
||||||
|
aExpF.Init(theResult, TopAbs_FACE);
|
||||||
|
for (; aExpF.More(); aExpF.Next()) {
|
||||||
|
const TopoDS_Face& aF = *(TopoDS_Face*)&aExpF.Current();
|
||||||
|
aExpE.Init(aF, TopAbs_EDGE);
|
||||||
|
for (; aExpE.More(); aExpE.Next()) {
|
||||||
|
const TopoDS_Edge& aE = *(TopoDS_Edge*)&aExpE.Current();
|
||||||
|
if (!BOPTools_AlgoTools::ComputeTolerance(aF, aE, aDMax, aT)) continue;
|
||||||
|
aTolE = BRep_Tool::Tolerance(aE);
|
||||||
|
if (aDMax < aTolE) continue;
|
||||||
|
if (aDMETol.IsBound(aE)) {
|
||||||
|
aD = aDMETol.Find(aE);
|
||||||
|
if (aDMax > aD) {
|
||||||
|
aDMETol.UnBind(aE);
|
||||||
|
aDMETol.Bind(aE, aDMax);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
aDMETol.Bind(aE, aDMax);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
NCollection_DataMap<TopoDS_Shape, Standard_Real, TopTools_ShapeMapHasher>::Iterator aDMETolIt(aDMETol);
|
||||||
|
ShapeFix_ShapeTolerance sat;
|
||||||
|
for (; aDMETolIt.More(); aDMETolIt.Next()) {
|
||||||
|
sat.LimitTolerance(aDMETolIt.Key(), aDMETolIt.Value());
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// try to deal with pure result of BRepOffsetAPI_MakeFilling
|
||||||
|
|
||||||
// Update tolerance
|
// Update tolerance
|
||||||
Standard_Real aTol = MF.G0Error();
|
Standard_Real aTol = MF.G0Error();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user