mirror of
https://git.salome-platform.org/gitpub/modules/geom.git
synced 2025-05-26 00:20:48 +05:00
PAL12149: Cannot create non-planar shells. Non-planar faces creation algorithm improved.
This commit is contained in:
parent
2e76e5e42e
commit
aeeebe32c2
@ -19,10 +19,10 @@
|
|||||||
//
|
//
|
||||||
#include <Standard_Stream.hxx>
|
#include <Standard_Stream.hxx>
|
||||||
|
|
||||||
#include <BRepOffsetAPI_MakeFilling.hxx>
|
|
||||||
|
|
||||||
#include <GEOMImpl_Block6Explorer.hxx>
|
#include <GEOMImpl_Block6Explorer.hxx>
|
||||||
|
|
||||||
|
#include <ShHealOper_ShapeProcess.hxx>
|
||||||
|
|
||||||
#include "utilities.h"
|
#include "utilities.h"
|
||||||
|
|
||||||
#include <BRep_Tool.hxx>
|
#include <BRep_Tool.hxx>
|
||||||
@ -33,6 +33,8 @@
|
|||||||
#include <BRepTools.hxx>
|
#include <BRepTools.hxx>
|
||||||
#include <BRepTools_WireExplorer.hxx>
|
#include <BRepTools_WireExplorer.hxx>
|
||||||
#include <BRepOffsetAPI_ThruSections.hxx>
|
#include <BRepOffsetAPI_ThruSections.hxx>
|
||||||
|
#include <BRepOffsetAPI_MakeFilling.hxx>
|
||||||
|
#include <BRepCheck_Analyzer.hxx>
|
||||||
#include <BRepBuilderAPI_Copy.hxx>
|
#include <BRepBuilderAPI_Copy.hxx>
|
||||||
#include <BRepBuilderAPI_MakeEdge.hxx>
|
#include <BRepBuilderAPI_MakeEdge.hxx>
|
||||||
#include <BRepBuilderAPI_MakeWire.hxx>
|
#include <BRepBuilderAPI_MakeWire.hxx>
|
||||||
@ -1202,43 +1204,61 @@ void GEOMImpl_Block6Explorer::MakeFace (const TopoDS_Wire& theWire,
|
|||||||
// Result of filling
|
// Result of filling
|
||||||
TopoDS_Shape aFace = MF.Shape();
|
TopoDS_Shape aFace = MF.Shape();
|
||||||
|
|
||||||
// Update tolerance
|
// 12.04.2006 for PAL12149 begin
|
||||||
Standard_Real aTol = MF.G0Error();
|
Handle(Geom_Surface) aGS = BRep_Tool::Surface(TopoDS::Face(aFace));
|
||||||
|
BRepBuilderAPI_MakeFace MK1 (aGS, theWire);
|
||||||
|
if (MK1.IsDone()) {
|
||||||
|
TopoDS_Shape aFace1 = MK1.Shape();
|
||||||
|
|
||||||
TColgp_Array1OfPnt aPnts (1,nbEdges); // points of the given wire
|
BRepCheck_Analyzer ana (aFace1, false);
|
||||||
BRepTools_WireExplorer aWE1 (theWire);
|
if (!ana.IsValid()) {
|
||||||
Standard_Integer vi = 1;
|
TopoDS_Shape aFace2;
|
||||||
for (; aWE1.More() && vi <= nbEdges; aWE1.Next(), vi++) {
|
ShHealOper_ShapeProcess aHealer;
|
||||||
aPnts(vi) = BRep_Tool::Pnt(TopoDS::Vertex(aWE1.CurrentVertex()));
|
aHealer.Perform(aFace1, aFace2);
|
||||||
}
|
if (aHealer.isDone())
|
||||||
|
theResult = aFace2;
|
||||||
// Find maximum deviation in vertices
|
|
||||||
TopExp_Explorer exp (aFace, TopAbs_VERTEX);
|
|
||||||
TopTools_MapOfShape mapShape;
|
|
||||||
for (; exp.More(); exp.Next()) {
|
|
||||||
if (mapShape.Add(exp.Current())) {
|
|
||||||
TopoDS_Vertex aV = TopoDS::Vertex(exp.Current());
|
|
||||||
Standard_Real aTolV = BRep_Tool::Tolerance(aV);
|
|
||||||
gp_Pnt aP = BRep_Tool::Pnt(aV);
|
|
||||||
Standard_Real min_dist = aP.Distance(aPnts(1));
|
|
||||||
for (vi = 2; vi <= nbEdges; vi++) {
|
|
||||||
min_dist = Min(min_dist, aP.Distance(aPnts(vi)));
|
|
||||||
}
|
|
||||||
aTol = Max(aTol, aTolV);
|
|
||||||
aTol = Max(aTol, min_dist);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// 12.04.2006 for PAL12149 end
|
||||||
|
|
||||||
if ((*((Handle(BRep_TFace)*)&aFace.TShape()))->Tolerance() < aTol) {
|
if (theResult.IsNull()) { // try to deal with pure result of filling
|
||||||
(*((Handle(BRep_TFace)*)&aFace.TShape()))->Tolerance(aTol);
|
// Update tolerance
|
||||||
|
Standard_Real aTol = MF.G0Error();
|
||||||
|
|
||||||
|
TColgp_Array1OfPnt aPnts (1,nbEdges); // points of the given wire
|
||||||
|
BRepTools_WireExplorer aWE1 (theWire);
|
||||||
|
Standard_Integer vi = 1;
|
||||||
|
for (; aWE1.More() && vi <= nbEdges; aWE1.Next(), vi++) {
|
||||||
|
aPnts(vi) = BRep_Tool::Pnt(TopoDS::Vertex(aWE1.CurrentVertex()));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find maximum deviation in vertices
|
||||||
|
TopExp_Explorer exp (aFace, TopAbs_VERTEX);
|
||||||
|
TopTools_MapOfShape mapShape;
|
||||||
|
for (; exp.More(); exp.Next()) {
|
||||||
|
if (mapShape.Add(exp.Current())) {
|
||||||
|
TopoDS_Vertex aV = TopoDS::Vertex(exp.Current());
|
||||||
|
Standard_Real aTolV = BRep_Tool::Tolerance(aV);
|
||||||
|
gp_Pnt aP = BRep_Tool::Pnt(aV);
|
||||||
|
Standard_Real min_dist = aP.Distance(aPnts(1));
|
||||||
|
for (vi = 2; vi <= nbEdges; vi++) {
|
||||||
|
min_dist = Min(min_dist, aP.Distance(aPnts(vi)));
|
||||||
|
}
|
||||||
|
aTol = Max(aTol, aTolV);
|
||||||
|
aTol = Max(aTol, min_dist);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((*((Handle(BRep_TFace)*)&aFace.TShape()))->Tolerance() < aTol) {
|
||||||
|
(*((Handle(BRep_TFace)*)&aFace.TShape()))->Tolerance(aTol);
|
||||||
|
}
|
||||||
|
theResult = aFace;
|
||||||
}
|
}
|
||||||
theResult = aFace;
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// try to update wire tolerances to build a planar face
|
// try to update wire tolerances to build a planar face
|
||||||
|
|
||||||
// With OCCT6.0 or lower
|
#if 1 //(OCC_VERSION_MAJOR < 6) || (OCC_VERSION_MAJOR == 6 && OCC_VERSION_MINOR <= 1)
|
||||||
|
|
||||||
// Find a deviation
|
// Find a deviation
|
||||||
Standard_Real aToleranceReached, aTol;
|
Standard_Real aToleranceReached, aTol;
|
||||||
BRepLib_FindSurface aFS;
|
BRepLib_FindSurface aFS;
|
||||||
@ -1276,12 +1296,13 @@ void GEOMImpl_Block6Explorer::MakeFace (const TopoDS_Wire& theWire,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// After migration on OCCT version higher than 6.0
|
#else // After migration on OCCT version, containing PKV's fix. See bug 8293
|
||||||
//BRepLib_MakeFace aBMF;
|
BRepLib_MakeFace aBMF;
|
||||||
//aBMF.Init(theWire, isPlanarWanted, Standard_True);
|
aBMF.Init(theWire, isPlanarWanted, Standard_True);
|
||||||
//if (aBMF.Error() == BRepLib_FaceDone) {
|
if (aBMF.Error() == BRepLib_FaceDone) {
|
||||||
// theResult = aBMF.Shape();
|
theResult = aBMF.Shape();
|
||||||
// return;
|
return;
|
||||||
//}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user