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.
* *result* -- optional parameter, defines custom prefix for the output shape names.
* *short* -- a short description of the check.
* *parallel* -- run check in multithread mode.
+* *exact* -- run check using exact method.
**checkshape** examines the selected object for topological and geometric coherence. The object should be a three dimensional shape.
//=======================================================================
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;
{
Init(E);
myGctrl = Standard_True;
+ myIsExactMethod = Standard_False;
}
//=======================================================================
BRep_ListIteratorOfListOfCurveRepresentation itcr(TE->Curves());
Standard_Real eps = Precision::PConfusion();
+ Standard_Boolean aRunParallel = !myMutex.IsNull();
while (itcr.More()) {
const Handle(BRep_CurveRepresentation)& cr = itcr.Value();
if (cr != myCref && cr->IsCurveOnSurface(Su,L)) {
BRepLib_ValidateEdge aValidateEdge(myHCurve, ACS, SameParameter);
aValidateEdge.SetExitIfToleranceExceeded(Tol);
- aValidateEdge.Process();
+ aValidateEdge.SetExactMethod(myIsExactMethod);
+ aValidateEdge.Process(aRunParallel);
if (!aValidateEdge.IsDone() || !aValidateEdge.CheckTolerance(Tol))
{
if (cr->IsCurveOnClosedSurface()) {
BRepLib_ValidateEdge aValidateEdgeOnClosedSurf(myHCurve, ACS, SameParameter);
aValidateEdgeOnClosedSurf.SetExitIfToleranceExceeded(Tol);
- aValidateEdgeOnClosedSurf.Process();
+ aValidateEdgeOnClosedSurf.SetExactMethod(myIsExactMethod);
+ aValidateEdgeOnClosedSurf.Process(aRunParallel);
if (!aValidateEdgeOnClosedSurf.IsDone() || !aValidateEdgeOnClosedSurf.CheckTolerance(Tol))
{
BRepCheck::Add(lst,BRepCheck_InvalidCurveOnClosedSurface);
BRepLib_ValidateEdge aValidateEdgeProj(myHCurve, ACS, SameParameter);
aValidateEdgeProj.SetExitIfToleranceExceeded(Tol);
- aValidateEdgeProj.Process();
+ aValidateEdgeProj.SetExactMethod(myIsExactMethod);
+ aValidateEdgeProj.Process(aRunParallel);
if (!aValidateEdgeProj.IsDone() || !aValidateEdgeProj.CheckTolerance(Tol))
{
BRepCheck::Add(lst,BRepCheck_InvalidCurveOnSurface);
//! 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
#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)
{ }
//=============================================================================
//function : Process
//purpose :
//=============================================================================
-void BRepLib_ValidateEdge::Process()
+void BRepLib_ValidateEdge::Process(Standard_Boolean theIsMultiThread)
+{
+ if (myIsExactMethod && mySameParameter)
+ {
+ ProcessExact(theIsMultiThread);
+ }
+ 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(Standard_Boolean theIsMultiThread)
+{
+ GeomLib_CheckCurveOnSurface aCheckCurveOnSurface(myReferenceCurve);
+ aCheckCurveOnSurface.Perform(myOtherCurve, theIsMultiThread);
+ 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).
+ //! Exact method is used only when edge is SameParameter.
+ //! Default method is calculating in finite number of points
+ 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
- Standard_EXPORT void Process();
+ //! greater than SetExitIfToleranceExceeded() parameter value. In case
+ //! using exact method always computes real max distance.
+ Standard_EXPORT void Process(Standard_Boolean theIsMultiThread = Standard_False);
//! Returns true if the distance has been found for all points
- Standard_Boolean IsDone()
+ Standard_Boolean IsDone() const
{
return myIsDone;
}
//! 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(Standard_Boolean theIsMultiThread);
+
Handle(Adaptor3d_Curve) myReferenceCurve;
Handle(Adaptor3d_CurveOnSurface) myOtherCurve;
Standard_Boolean mySameParameter;
Standard_Real myCalculatedDistance;
Standard_Boolean myExitIfToleranceExceeded;
Standard_Boolean myIsDone;
+ Standard_Boolean myIsExactMethod;
};
-#endif // _BRepLib_ValidateEdge_HeaderFile
\ No newline at end of file
+#endif // _BRepLib_ValidateEdge_HeaderFile
theCommands << "Usage : checkshape [-top] shape [result] [-short] [-parallel]\n";
theCommands << "\n";
theCommands << "Where :\n";
- theCommands << " -top - check topology only.\n";
- theCommands << " shape - the name of the shape to test.\n";
- theCommands << " result - the prefix of the output shape names. If it is used, structural\n";
- theCommands << " output style will be used. Otherwise - contextual one.\n";
- theCommands << " -short - short description of check.\n";
+ theCommands << " -top - check topology only.\n";
+ theCommands << " shape - the name of the shape to test.\n";
+ theCommands << " result - the prefix of the output shape names. If it is used, structural\n";
+ theCommands << " output style will be used. Otherwise - contextual one.\n";
+ theCommands << " -short - short description of check.\n";
theCommands << " -parallel - run check in parallel.\n";
+ theCommands << " -exact - run check using exact method.\n";
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