1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-08-14 13:30:48 +03:00

0030363: BRepLib::SameParameter with option "forced" corrupts valid shape

Method BRepLib::SameParameter has been corrected to synchronize check of resulting tolerance with BRepCheck.
This commit is contained in:
jgv
2018-11-15 15:36:22 +03:00
parent 061cd2d841
commit e9c073b866
5 changed files with 97 additions and 76 deletions

View File

@@ -23,6 +23,11 @@
#include <TopoDS_Edge.hxx>
#include <TopoDS_Face.hxx>
#include <TopoDS_Wire.hxx>
#include <Adaptor3d_Curve.hxx>
#include <Adaptor3d_HSurface.hxx>
#include <GeomAbs_CurveType.hxx>
#include <GeomAbs_SurfaceType.hxx>
#include <gp_Elips.hxx>
//=======================================================================
//function : Add
@@ -44,6 +49,7 @@ void BRepCheck::Add(BRepCheck_ListOfStatus& lst, const BRepCheck_Status stat)
}
lst.Append(stat);
}
//=======================================================================
//function : SelfIntersection
//purpose :
@@ -57,6 +63,67 @@ Standard_Boolean BRepCheck::SelfIntersection(const TopoDS_Wire& W,
BRepCheck_Status stat = chkw->SelfIntersect(myFace,RetE1,RetE2);
return (stat == BRepCheck_SelfIntersectingWire);
}
//=======================================================================
//function : PrecCurve
//purpose :
//=======================================================================
Standard_Real BRepCheck::PrecCurve(const Adaptor3d_Curve& aAC3D)
{
Standard_Real aXEmax = RealEpsilon();
//
GeomAbs_CurveType aCT = aAC3D.GetType();
if (aCT==GeomAbs_Ellipse) {
Standard_Real aX[5];
//
gp_Elips aEL3D=aAC3D.Ellipse();
aEL3D.Location().Coord(aX[0], aX[1], aX[2]);
aX[3]=aEL3D.MajorRadius();
aX[4]=aEL3D.MinorRadius();
aXEmax=-1.;
for (Standard_Integer i = 0; i < 5; ++i) {
if (aX[i]<0.) {
aX[i]=-aX[i];
}
Standard_Real aXE = Epsilon(aX[i]);
if (aXE > aXEmax) {
aXEmax = aXE;
}
}
}//if (aCT=GeomAbs_Ellipse) {
//
return aXEmax;
}
//=======================================================================
//function : PrecSurface
//purpose :
//=======================================================================
Standard_Real BRepCheck::PrecSurface(const Handle(Adaptor3d_HSurface)& aAHSurf)
{
Standard_Real aXEmax = RealEpsilon();
//
GeomAbs_SurfaceType aST = aAHSurf->GetType();
if (aST == GeomAbs_Cone) {
gp_Cone aCone=aAHSurf->Cone();
Standard_Real aX[4];
//
aCone.Location().Coord(aX[0], aX[1], aX[2]);
aX[3]=aCone.RefRadius();
aXEmax=-1.;
for (Standard_Integer i = 0; i < 4; ++i) {
if (aX[i] < 0.) {
aX[i] = -aX[i];
}
Standard_Real aXE = Epsilon(aX[i]);
if (aXE > aXEmax) {
aXEmax = aXE;
}
}
}//if (aST==GeomAbs_Cone) {
return aXEmax;
}
//=======================================================================
//function : Print
//purpose :

View File

@@ -28,6 +28,8 @@
class TopoDS_Wire;
class TopoDS_Face;
class TopoDS_Edge;
class Adaptor3d_Curve;
class Adaptor3d_HSurface;
class BRepCheck_Result;
class BRepCheck_Vertex;
class BRepCheck_Edge;
@@ -53,6 +55,11 @@ public:
Standard_EXPORT static Standard_Boolean SelfIntersection (const TopoDS_Wire& W, const TopoDS_Face& F, TopoDS_Edge& E1, TopoDS_Edge& E2);
//! Returns the resolution on the 3d curve
Standard_EXPORT static Standard_Real PrecCurve(const Adaptor3d_Curve& aAC3D);
//! Returns the resolution on the surface
Standard_EXPORT static Standard_Real PrecSurface(const Handle(Adaptor3d_HSurface)& aAHSurf);

View File

@@ -77,10 +77,6 @@ static
static
Standard_Real Prec(const Adaptor3d_Curve& aAC3D,
const Adaptor3d_CurveOnSurface& aACS);
static
Standard_Real PrecCurve(const Adaptor3d_Curve& aAC3D);
static
Standard_Real PrecSurface(const Adaptor3d_CurveOnSurface& aACS);
//static Standard_Boolean Validate(const Adaptor3d_Curve&,
// const Adaptor3d_Curve&,
@@ -898,87 +894,23 @@ Standard_Boolean Validate(const Adaptor3d_Curve& CRef,
return Status ;
}
//=======================================================================
//function : Prec
//purpose :
//=======================================================================
Standard_Real Prec(const Adaptor3d_Curve& aAC3D,
const Adaptor3d_CurveOnSurface& aACS)
const Adaptor3d_CurveOnSurface& aACS)
{
Standard_Real aXEmax, aXC, aXS;
const Handle(Adaptor3d_HSurface)& aAHS = aACS.GetSurface();
//
aXC=PrecCurve(aAC3D);
aXS=PrecSurface(aACS);
aXEmax=(aXC>aXS) ? aXC: aXS;
return aXEmax;
}
//=======================================================================
//function : PrecCurve
//purpose :
//=======================================================================
Standard_Real PrecCurve(const Adaptor3d_Curve& aAC3D)
{
Standard_Real aXEmax;
GeomAbs_CurveType aCT;
//
aXEmax=RealEpsilon();
//
aCT=aAC3D.GetType();
if (aCT==GeomAbs_Ellipse) {
Standard_Integer i;
Standard_Real aX[5], aXE;
//
gp_Elips aEL3D=aAC3D.Ellipse();
aEL3D.Location().Coord(aX[0], aX[1], aX[2]);
aX[3]=aEL3D.MajorRadius();
aX[4]=aEL3D.MinorRadius();
aXEmax=-1.;
for (i=0; i<5; ++i) {
if (aX[i]<0.) {
aX[i]=-aX[i];
}
aXE=Epsilon(aX[i]);
if (aXE>aXEmax) {
aXEmax=aXE;
}
}
}//if (aCT=GeomAbs_Ellipse) {
//
return aXEmax;
}
//=======================================================================
//function : PrecSurface
//purpose :
//=======================================================================
Standard_Real PrecSurface(const Adaptor3d_CurveOnSurface& aACS)
{
Standard_Real aXEmax;
GeomAbs_SurfaceType aST;
//
aXEmax=RealEpsilon();
//
const Handle(Adaptor3d_HSurface)& aAHS=aACS.GetSurface();
aST=aAHS->GetType();
if (aST==GeomAbs_Cone) {
gp_Cone aCone=aAHS->Cone();
Standard_Integer i;
Standard_Real aX[4], aXE;
//
aCone.Location().Coord(aX[0], aX[1], aX[2]);
aX[3]=aCone.RefRadius();
aXEmax=-1.;
for (i=0; i<4; ++i) {
if (aX[i]<0.) {
aX[i]=-aX[i];
}
aXE=Epsilon(aX[i]);
if (aXE>aXEmax) {
aXEmax=aXE;
}
}
}//if (aST==GeomAbs_Cone) {
aXC = BRepCheck::PrecCurve(aAC3D);
aXS = BRepCheck::PrecSurface(aAHS);
aXEmax = (aXC>aXS) ? aXC: aXS;
return aXEmax;
}
//=======================================================================
//function : PrintProblematicPoint
//purpose :