Add '-exact' option to checkshape command to use exact method to validate edges using BRepLib_ValidateEdge class. Default mode is calculating in finite number of points.
//=======================================================================
void BRepCheck_Analyzer::Init (const TopoDS_Shape& theShape,
const Standard_Boolean B,
- const Standard_Boolean theIsParallel)
+ const Standard_Boolean theIsParallel,
+ const Standard_Boolean theIsExact)
{
if (theShape.IsNull())
{
myShape = theShape;
myMap.Clear();
- Put (theShape, B, theIsParallel);
+ Put (theShape, B, theIsParallel, theIsExact);
Perform (theIsParallel);
}
//=======================================================================
void BRepCheck_Analyzer::Put (const TopoDS_Shape& theShape,
const Standard_Boolean B,
- const Standard_Boolean theIsParallel)
+ const Standard_Boolean theIsParallel,
+ const Standard_Boolean theIsExact)
{
if (myMap.Contains (theShape))
{
case TopAbs_EDGE:
HR = new BRepCheck_Edge (TopoDS::Edge (theShape));
Handle(BRepCheck_Edge)::DownCast(HR)->GeometricControls (B);
+ Handle(BRepCheck_Edge)::DownCast(HR)->SetExactMethod(theIsExact);
break;
case TopAbs_WIRE:
HR = new BRepCheck_Wire (TopoDS::Wire (theShape));
for (TopoDS_Iterator theIterator (theShape); theIterator.More(); theIterator.Next())
{
- Put (theIterator.Value(), B, theIsParallel); // performs minimum on each shape
+ Put (theIterator.Value(), B, theIsParallel, theIsExact); // performs minimum on each shape
}
}
//function : Perform
//purpose :
//=======================================================================
-void BRepCheck_Analyzer::Perform (Standard_Boolean theIsParallel)
+void BRepCheck_Analyzer::Perform (const Standard_Boolean theIsParallel)
{
const Standard_Integer aMapSize = myMap.Size();
const Standard_Integer aMinTaskSize = 10;
//! BRepCheck_SelfIntersectingWire
BRepCheck_Analyzer (const TopoDS_Shape& S,
const Standard_Boolean GeomControls = Standard_True,
- const Standard_Boolean theIsParallel = Standard_False)
+ const Standard_Boolean theIsParallel = Standard_False,
+ const Standard_Boolean theIsExact = Standard_False)
{
- Init (S, GeomControls, theIsParallel);
+ Init (S, GeomControls, theIsParallel, theIsExact);
}
//! <S> is the shape to control. <GeomControls> If
//! BRepCheck_SelfIntersectingWire
Standard_EXPORT void Init (const TopoDS_Shape& S,
const Standard_Boolean GeomControls = Standard_True,
- const Standard_Boolean theIsParallel = Standard_False);
+ const Standard_Boolean theIsParallel = Standard_False,
+ const Standard_Boolean theIsExact = Standard_False);
//! <S> is a subshape of the original shape. Returns
//! <STandard_True> if no default has been detected on
Standard_EXPORT void Put (const TopoDS_Shape& S,
const Standard_Boolean Gctrl,
- const Standard_Boolean theIsParallel);
+ const Standard_Boolean theIsParallel,
+ const Standard_Boolean theIsExact);
- Standard_EXPORT void Perform (Standard_Boolean theIsParallel);
+ Standard_EXPORT void Perform (const Standard_Boolean theIsParallel);
Standard_EXPORT Standard_Boolean ValidSub (const TopoDS_Shape& S, const TopAbs_ShapeEnum SubType) const;
BRepLib_ValidateEdge aValidateEdge(myHCurve, ACS, SameParameter);
aValidateEdge.SetExitIfToleranceExceeded(Tol);
+ aValidateEdge.SetExactMethod(myIsExactMethod);
+ aValidateEdge.SetParallel(myIsParallel);
aValidateEdge.Process();
if (!aValidateEdge.IsDone() || !aValidateEdge.CheckTolerance(Tol))
{
BRepLib_ValidateEdge aValidateEdgeOnClosedSurf(myHCurve, ACS, SameParameter);
aValidateEdgeOnClosedSurf.SetExitIfToleranceExceeded(Tol);
+ aValidateEdgeOnClosedSurf.SetExactMethod(myIsExactMethod);
+ aValidateEdgeOnClosedSurf.SetParallel(myIsParallel);
aValidateEdgeOnClosedSurf.Process();
if (!aValidateEdgeOnClosedSurf.IsDone() || !aValidateEdgeOnClosedSurf.CheckTolerance(Tol))
{
BRepLib_ValidateEdge aValidateEdgeProj(myHCurve, ACS, SameParameter);
aValidateEdgeProj.SetExitIfToleranceExceeded(Tol);
+ aValidateEdgeProj.SetExactMethod(myIsExactMethod);
+ aValidateEdgeProj.SetParallel(myIsParallel);
aValidateEdgeProj.Process();
if (!aValidateEdgeProj.IsDone() || !aValidateEdgeProj.CheckTolerance(Tol))
{
//! Sets status of Edge;
Standard_EXPORT void SetStatus (const BRepCheck_Status theStatus);
+
+ //! Sets validate edge method
+ void SetExactMethod(Standard_Boolean theIsExact)
+ {
+ myIsExactMethod = theIsExact;
+ }
//! Checks, if polygon on triangulation of heEdge
//! is out of 3D-curve of this edge.
Handle(BRep_CurveRepresentation) myCref;
Handle(Adaptor3d_Curve) myHCurve;
Standard_Boolean myGctrl;
-
+ Standard_Boolean myIsExactMethod;
};
#endif // _BRepCheck_Edge_HeaderFile
//=======================================================================
BRepCheck_Result::BRepCheck_Result()
: myMin (Standard_False),
- myBlind (Standard_False)
+ myBlind (Standard_False),
+ myIsParallel (Standard_False)
{
//
}
myShape = S;
myMin = Standard_False;
myBlind = Standard_False;
+ myIsParallel = Standard_False;
myMap.Clear();
Minimum();
}
//=======================================================================
void BRepCheck_Result::SetParallel(Standard_Boolean theIsParallel)
{
+ myIsParallel = theIsParallel;
if (theIsParallel && myMutex.IsNull())
{
myMutex.reset(new Standard_HMutex());
Standard_Boolean myMin;
Standard_Boolean myBlind;
BRepCheck_DataMapOfShapeListOfStatus myMap;
+ Standard_Boolean myIsParallel;
mutable Handle(Standard_HMutex) myMutex;
private:
#include <Adaptor3d_CurveOnSurface.hxx>
#include <BRepCheck.hxx>
#include <Extrema_LocateExtPC.hxx>
+#include <GeomLib_CheckCurveOnSurface.hxx>
//=============================================================================
//function : BRepLib_ValidateEdge
myToleranceForChecking(0),
myCalculatedDistance(0),
myExitIfToleranceExceeded(Standard_False),
- myIsDone(Standard_False)
+ myIsDone(Standard_False),
+ myIsExactMethod(Standard_False)
{ }
//=============================================================================
//purpose :
//=============================================================================
void BRepLib_ValidateEdge::Process()
+{
+ if (myIsExactMethod && mySameParameter)
+ {
+ ProcessExact();
+ }
+ else
+ {
+ ProcessApprox();
+ }
+}
+
+//=============================================================================
+//function : ProcessApprox
+//purpose :
+//=============================================================================
+void BRepLib_ValidateEdge::ProcessApprox()
{
myIsDone = Standard_True;
Standard_Real aSquareToleranceForChecking = myToleranceForChecking * myToleranceForChecking;
}
myCalculatedDistance = Sqrt(aMaxSquareDistance);
}
+
+//=============================================================================
+//function : ProcessExact
+//purpose :
+//=============================================================================
+void BRepLib_ValidateEdge::ProcessExact()
+{
+ GeomLib_CheckCurveOnSurface aCheckCurveOnSurface(myReferenceCurve);
+ aCheckCurveOnSurface.Perform(myOtherCurve, myIsParallel);
+ myIsDone = aCheckCurveOnSurface.IsDone();
+ if (myIsDone)
+ {
+ myCalculatedDistance = aCheckCurveOnSurface.MaxDistance();
+ }
+}
+
class Adaptor3d_Curve;
class Adaptor3d_CurveOnSurface;
-//! Computes the max distance between 3D-curve and curve on
-//! surface in fixed points number
+//! Computes the max distance between 3D-curve and curve on surface.
+//! This class uses 2 methods: approximate using finite
+//! number of points (default) and exact
class BRepLib_ValidateEdge
{
public:
myControlPointsNumber = theControlPointsNumber;
}
- //! Sets the maximal allowed distance in the Process() function. If the distance greater than
- //! theToleranceForChecking the Process() function stops. Use this for best performance
- //! in case of checking of tolerance.
- Standard_EXPORT void SetExitIfToleranceExceeded(Standard_Real theToleranceForChecking);
+ //! Sets method to calculate distance: Calculating in finite number of points (if theIsExact
+ //! is false, faster, but possible not correct result) or exact calculating by using
+ //! BRepLib_CheckCurveOnSurface class (if theIsExact is true, slowly, but more correctly.
+ //! Default method is exact
+ void SetExactMethod(Standard_Boolean theIsExact)
+ {
+ myIsExactMethod = theIsExact;
+ }
+
+ //! Sets limit to compute a distance in the Process() function. If the distance greater than
+ //! theToleranceForChecking the Process() function stopped. Use this in case checking of
+ //! tolerance for best performcnce. Has no effect in case using exact method.
+ void SetExitIfToleranceExceeded(Standard_Real theToleranceForChecking);
//! Computes the max distance for the 3d curve <myReferenceCurve>
//! and curve on surface <myOtherCurve>. If the SetExitIfToleranceExceeded()
//! function was called before <myCalculatedDistance> contains first
- //! greater than SetExitIfToleranceExceeded() parameter value
+ //! greater than SetExitIfToleranceExceeded() parameter value. In case
+ //! using exact method always computes real max distance.
Standard_EXPORT void Process();
//! Returns true if the distance has been found for all points
- Standard_Boolean IsDone()
+ Standard_Boolean IsDone() const
{
return myIsDone;
}
+ //! Sets process validating in parallel
+ void SetParallel(const Standard_Boolean theIsParallel)
+ {
+ myIsParallel = theIsParallel;
+ }
+
//! Returns true if computed distance is less than <theToleranceToCheck>
Standard_EXPORT Standard_Boolean CheckTolerance(Standard_Real theToleranceToCheck);
//! Adds some margin for distance checking
Standard_Real correctTolerance(Standard_Real theTolerance);
-private:
+ //! Calculating in finite number of points
+ void ProcessApprox();
+
+ //! Calculating by using BRepLib_CheckCurveOnSurface class
+ void ProcessExact();
+
Handle(Adaptor3d_Curve) myReferenceCurve;
Handle(Adaptor3d_CurveOnSurface) myOtherCurve;
Standard_Boolean mySameParameter;
Standard_Real myCalculatedDistance;
Standard_Boolean myExitIfToleranceExceeded;
Standard_Boolean myIsDone;
+ Standard_Boolean myIsExactMethod;
+ Standard_Boolean myIsParallel;
};
-#endif // _BRepLib_ValidateEdge_HeaderFile
\ No newline at end of file
+#endif // _BRepLib_ValidateEdge_HeaderFile
return 0;
}
- if (narg > 6)
+ if (narg > 7)
{
theCommands << "Invalid number of args!!!\n";
theCommands << "No args to have help.\n";
Standard_Boolean IsShortDump = Standard_False;
Standard_Boolean IsContextDump = Standard_True;
Standard_Boolean IsParallel = Standard_False;
+ Standard_Boolean IsExact = Standard_False;
Standard_CString aPref(NULL);
if (aCurInd < narg && strncmp(a[aCurInd], "-", 1))
{
{
IsParallel = Standard_True;
}
+ else if (anArg == "-exact")
+ {
+ IsExact = Standard_True;
+ }
else
{
theCommands << "Syntax error at '" << anArg << "'";
try
{
OCC_CATCH_SIGNALS
- BRepCheck_Analyzer anAna (aShape, aGeomCtrl, IsParallel);
+ BRepCheck_Analyzer anAna (aShape, aGeomCtrl, IsParallel, IsExact);
Standard_Boolean isValid = anAna.IsValid();
if (isValid)
-puts "REQUIRED All: Faulty shapes in variables faulty_1 to faulty_51"
+puts "REQUIRED All: Faulty shapes in variables faulty_1 to faulty_31"
puts "=========="
puts "0027814: Parallelize BRepCheck_Analyzer"
puts "=========="
puts ""
-CheckPerform [locate_data_file OCC394.brep]
\ No newline at end of file
+CheckPerform [locate_data_file OCC396.brep]
\ No newline at end of file
-puts "REQUIRED All: Faulty shapes in variables faulty_1 to faulty_31"
+puts "REQUIRED All: Faulty shapes in variables faulty_1 to faulty_287"
puts "=========="
puts "0027814: Parallelize BRepCheck_Analyzer"
puts "=========="
puts ""
-CheckPerform [locate_data_file OCC396.brep]
\ No newline at end of file
+CheckPerform [locate_data_file OCC54.brep]
\ No newline at end of file
--- /dev/null
+puts "REQUIRED All: Faulty shapes in variables faulty_1 to faulty_88"
+puts "=========="
+puts "0032448: Provide exact validating (as option) using GeomLib_CheckCurveOnSurface"
+puts "=========="
+puts ""
+
+restore [locate_data_file bug27814.brep] b
+checkshape b -exact -parallel
--- /dev/null
+puts "REQUIRED All: Faulty shapes in variables faulty_1 to faulty_6101"
+puts "=========="
+puts "0032448: Provide exact validating (as option) using GeomLib_CheckCurveOnSurface"
+puts "=========="
+puts ""
+
+restore [locate_data_file OCC54.brep] b
+checkshape b -exact -parallel
--- /dev/null
+puts "=========="
+puts "0032448: Provide exact validating (as option) using GeomLib_CheckCurveOnSurface"
+puts "=========="
+puts ""
+
+restore [locate_data_file 5000-12.brep] b
+checkshape b -exact -parallel
--- /dev/null
+puts "REQUIRED All: Faulty shapes in variables faulty_1 to faulty_3675"
+puts "=========="
+puts "0032448: Provide exact validating (as option) using GeomLib_CheckCurveOnSurface"
+puts "=========="
+puts ""
+
+restore [locate_data_file BPLSEITLI.brep] b
+checkshape b -exact -parallel
--- /dev/null
+puts "=========="
+puts "0032448: Provide exact validating (as option) using GeomLib_CheckCurveOnSurface"
+puts "=========="
+puts ""
+
+restore [locate_data_file bug24525_License.brep] b
+checkshape b -exact -parallel
--- /dev/null
+puts "REQUIRED All: Faulty shapes in variables faulty_1 to faulty_8234"
+puts "=========="
+puts "0032448: Provide exact validating (as option) using GeomLib_CheckCurveOnSurface"
+puts "=========="
+puts ""
+
+restore [locate_data_file bug26278_E01754_000000_P00_01_0_VS3_1_20070102_sewed_fixed.brep] b
+checkshape b -exact -parallel
--- /dev/null
+puts "REQUIRED All: Faulty shapes in variables faulty_1 to faulty_7656"
+puts "=========="
+puts "0032448: Provide exact validating (as option) using GeomLib_CheckCurveOnSurface"
+puts "=========="
+puts ""
+
+restore [locate_data_file bug30360_GES-13500-000.brep] b
+checkshape b -exact -parallel
--- /dev/null
+puts "REQUIRED All: Faulty shapes in variables faulty_1 to faulty_1943"
+puts "=========="
+puts "0032448: Provide exact validating (as option) using GeomLib_CheckCurveOnSurface"
+puts "=========="
+puts ""
+
+restore [locate_data_file OCC187_from_bug_description.brep] b
+checkshape b -exact -parallel
--- /dev/null
+puts "REQUIRED All: Faulty shapes in variables faulty_1 to faulty_502"
+puts "=========="
+puts "0032448: Provide exact validating (as option) using GeomLib_CheckCurveOnSurface"
+puts "=========="
+puts ""
+
+restore [locate_data_file OCC394.brep] b
+checkshape b -exact -parallel
--- /dev/null
+puts "REQUIRED All: Faulty shapes in variables faulty_1 to faulty_467"
+puts "=========="
+puts "0032448: Provide exact validating (as option) using GeomLib_CheckCurveOnSurface"
+puts "=========="
+puts ""
+
+restore [locate_data_file OCC396.brep] b
+checkshape b -exact -parallel