Added the function Tolerance2d().
Now 2d-tolerance is used instead of 3d-tolerance where it's necessary.
#include <BRep_CurveOnClosedSurface.hxx>
#include <BRep_CurveOnSurface.hxx>
#include <BRep_CurveRepresentation.hxx>
+#include <BRep_GCurve.hxx>
#include <BRep_Polygon3D.hxx>
#include <BRep_PolygonOnSurface.hxx>
#include <BRep_PolygonOnTriangulation.hxx>
#include <BRep_TFace.hxx>
#include <BRep_Tool.hxx>
#include <BRep_TVertex.hxx>
+#include <BRepAdaptor_Surface.hxx>
#include <ElSLib.hxx>
#include <Geom2d_Curve.hxx>
#include <Geom2d_TrimmedCurve.hxx>
#include <TopoDS_Vertex.hxx>
#include <TopTools_MapOfShape.hxx>
#include <TopTools_ShapeMapHasher.hxx>
-#include <BRep_GCurve.hxx>
// modified by NIZNHY-PKV Fri Oct 17 14:13:29 2008f
static Standard_Boolean IsPlane(const Handle(Geom_Surface)& aS);
return aTol;
}
+
+//=======================================================================
+//function : Tolerance2d
+//purpose :
+//=======================================================================
+Standard_Real BRep_Tool::Tolerance2d(const TopoDS_Face& theFace, const Standard_Real theTolerance)
+{
+ BRepAdaptor_Surface aAdaptorSurface(theFace);
+ return Max(aAdaptorSurface.UResolution(theTolerance), aAdaptorSurface.VResolution(theTolerance));
+}
//@param theSubShape - Search subshape, only Face, Edge or Vertex are supported.
Standard_EXPORT static Standard_Real MaxTolerance(const TopoDS_Shape& theShape,
const TopAbs_ShapeEnum theSubShape);
+
+ //! Returns the 2d tolerance.
+ //@param theFace - the input face to find 2d tolerance
+ //@param theTolerance - the input tolerance to calculate 2d tolerance.
+ Standard_EXPORT static Standard_Real Tolerance2d(const TopoDS_Face& theFace,
+ const Standard_Real theTolerance);
+
};
#endif // _BRep_Tool_HeaderFile
Standard_Real Udeb, Ufin;
BRep_Tool::Range(Eother, Udeb, Ufin);
- gp_Pnt P1, Pt;
- Standard_Integer i, ii;
- BRepClass_FaceClassifier classifier;
+ gp_Pnt P1, Pt;
+ Standard_Integer i, ii;
for (i = 1; i <= arrInter.Length(); i++)
{
const Standard_Real aParameter = arrInter(i);
Standard_Real U, V;
gp_Pnt Pt, P1 = BRep_Tool::Pnt(theS1);
BRepClass_FaceClassifier classifier;
- const Standard_Real tol = BRep_Tool::Tolerance(theS2);
+ const Standard_Real tol2d = BRep_Tool::Tolerance2d(theS2, BRep_Tool::Tolerance(theS2));
for (i = 1; i <= NbExtrema; i++)
{
// Check if the parameter does not correspond to a vertex
Ext.Parameter(i, U, V);
const gp_Pnt2d PUV(U, V);
- classifier.Perform(theS2, PUV, tol);
+ classifier.Perform(theS2, PUV, tol2d);
if (classifier.State() == TopAbs_IN)
{
if (myDstRef > Dstmin)
if ((Dstmin < myDstRef - myEps) || (fabs(Dstmin - myDstRef) < myEps))
{
Standard_Real U, V;
- const Standard_Real tol = BRep_Tool::Tolerance(theS2);
+ const Standard_Real tol2d = BRep_Tool::Tolerance2d(theS2, BRep_Tool::Tolerance(theS2));
gp_Pnt Pt1, Pt2;
constexpr Standard_Real epsP = Precision::PConfusion();
{
Ext.ParameterOnFace(i, U, V);
const gp_Pnt2d PUV(U, V);
- classifier.Perform(theS2, PUV, tol);
+ classifier.Perform(theS2, PUV, tol2d);
if (classifier.State() == TopAbs_IN)
{
if (myDstRef > Dstmin)
gp_Pnt Pt;
Standard_Real U, V;
- const Standard_Real tol = BRep_Tool::Tolerance(theS2);
+ const Standard_Real tol2d = BRep_Tool::Tolerance2d(theS2, BRep_Tool::Tolerance(theS2));
Standard_Integer i;
for (i = 1; i <= arrInter.Length(); i++)
// Check if the parameter does not correspond to a vertex
ExtPF.Parameter(ii, U, V);
const gp_Pnt2d PUV(U, V);
- classifier.Perform(theS2, PUV, tol);
+ classifier.Perform(theS2, PUV, tol2d);
if (classifier.State() == TopAbs_IN)
{
if (myDstRef > Dstmin)
Dstmin = sqrt(Dstmin);
if ((Dstmin < myDstRef - myEps) || (fabs(Dstmin - myDstRef) < myEps))
{
- const Standard_Real tol1 = BRep_Tool::Tolerance(theS1);
- const Standard_Real tol2 = BRep_Tool::Tolerance(theS2);
+ const Standard_Real tol2d1 = BRep_Tool::Tolerance2d(theS1, BRep_Tool::Tolerance(theS1));
+ const Standard_Real tol2d2 = BRep_Tool::Tolerance2d(theS2, BRep_Tool::Tolerance(theS2));
gp_Pnt Pt1, Pt2;
gp_Pnt2d PUV;
// Check if the parameter does not correspond to a vertex
Ext.ParameterOnFace1(i, U1, V1);
PUV.SetCoord(U1, V1);
- classifier.Perform(theS1, PUV, tol1);
+ classifier.Perform(theS1, PUV, tol2d1);
if (classifier.State() == TopAbs_IN)
{
Ext.ParameterOnFace2(i, U2, V2);
PUV.SetCoord(U2, V2);
- classifier.Perform(theS2, PUV, tol2);
+ classifier.Perform(theS2, PUV, tol2d2);
if (classifier.State() == TopAbs_IN)
{
if (myDstRef > Dstmin)
{
// Exploration of points and classification
BRepClass_FaceClassifier classifier;
- const Standard_Real Tol2 = BRep_Tool::Tolerance(F2);
+ const Standard_Real Tol2d2 = BRep_Tool::Tolerance2d(F2, BRep_Tool::Tolerance(F2));
Extrema_POnSurf P1, P2;
Standard_Integer i;
myExtSS.Points(i, P1, P2);
P1.Parameter(U1, U2);
const gp_Pnt2d Puv1(U1, U2);
- classifier.Perform(F1, Puv1, Tol1);
+ const Standard_Real Tol2d1 = BRep_Tool::Tolerance2d(F1, Tol1);
+ classifier.Perform(F1, Puv1, Tol2d1);
const TopAbs_State state1 = classifier.State();
if (state1 == TopAbs_ON || state1 == TopAbs_IN)
{
P2.Parameter(U1, U2);
const gp_Pnt2d Puv2(U1, U2);
- classifier.Perform(F2, Puv2, Tol2);
+ classifier.Perform(F2, Puv2, Tol2d2);
const TopAbs_State state2 = classifier.State();
if (state2 == TopAbs_ON || state2 == TopAbs_IN)
{
{
BRepClass_FaceClassifier classifier;
Standard_Real U1, U2;
- const Standard_Real Tol = BRep_Tool::Tolerance(TheFace);
+ const Standard_Real Tol2d = BRep_Tool::Tolerance2d(TheFace, BRep_Tool::Tolerance(TheFace));
for (Standard_Integer i = 1; i <= myExtPS.NbExt(); i++)
{
myExtPS.Point(i).Parameter(U1, U2);
const gp_Pnt2d Puv(U1, U2);
- classifier.Perform(TheFace, Puv, Tol);
+ classifier.Perform(TheFace, Puv, Tol2d);
const TopAbs_State state = classifier.State();
if (state == TopAbs_ON || state == TopAbs_IN)
{
--- /dev/null
+puts "========================"
+puts "0033394: Modeling Algorithms - Wrong usage of BRepClass_FaceClassifier with 3d tolerance"
+puts "========================"
+puts ""
+
+pload MODELING
+restore [locate_data_file bug33394.brep] fb
+vertex vert 1016.3915670000133 17180 -5689.3758362036951
+distmini aa fb vert
+set tolerance [checkmaxtol aa]
+
+if { [dval aa_val] > ${tolerance} } {
+ puts "Error: The distance should be 0"
+}