Files
OCCT/src/IntTools/IntTools_EdgeEdge.hxx
msv 28c08a7d40 0029038: Modeling - IntTools_EdgeEdge::FindParameters() hangs on bad curve
Make possibility to dramatically increase the step during iteration on the curve when the global resolution of the curve is too small.
Correct the functions FindParameters, FindBestSolution, FindDistPC.

The change caused improvement of the test case "boolean bfuse_complex E4", so the bug #27697 has been fixed.

The change caused dramatic improvement of the performance of the test "bugs modalg_7 bug27160", and the bug #29080 has been fixed.
2017-09-22 11:51:56 +03:00

229 lines
6.6 KiB
C++

// Created by: Eugeny MALTCHIKOV
// Copyright (c) 2013-2014 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#ifndef _IntTools_EdgeEdge_HeaderFile
#define _IntTools_EdgeEdge_HeaderFile
#include <Standard.hxx>
#include <Standard_DefineAlloc.hxx>
#include <Standard_Handle.hxx>
#include <TopoDS_Edge.hxx>
#include <BRepAdaptor_Curve.hxx>
#include <Standard_Real.hxx>
#include <IntTools_Range.hxx>
#include <Standard_Boolean.hxx>
#include <Standard_Integer.hxx>
#include <IntTools_SequenceOfCommonPrts.hxx>
#include <IntTools_SequenceOfRanges.hxx>
#include <TopAbs_ShapeEnum.hxx>
class Geom_Curve;
class TopoDS_Edge;
class IntTools_Range;
class Bnd_Box;
class BRepAdaptor_Curve;
//! The class provides Edge/Edge intersection algorithm
//! based on the intersection between edges bounding boxes.
class IntTools_EdgeEdge
{
public:
DEFINE_STANDARD_ALLOC
//! Empty contructor
IntTools_EdgeEdge();
//! Destructor
~IntTools_EdgeEdge();
//! Contructor
IntTools_EdgeEdge(const TopoDS_Edge& theEdge1, const TopoDS_Edge& theEdge2);
//! Contructor
IntTools_EdgeEdge(const TopoDS_Edge& theEdge1, const Standard_Real aT11,
const Standard_Real aT12, const TopoDS_Edge& theEdge2,
const Standard_Real aT21, const Standard_Real aT22);
//! Sets the first edge
void SetEdge1(const TopoDS_Edge& theEdge);
//! Sets the first edge and its range
void SetEdge1(const TopoDS_Edge& theEdge, const Standard_Real aT1, const Standard_Real aT2);
//! Sets the range for the first edge
void SetRange1(const IntTools_Range& theRange1);
//! Sets the range for the first edge
void SetRange1(const Standard_Real aT1, const Standard_Real aT2);
//! Sets the second edge
void SetEdge2(const TopoDS_Edge& theEdge);
//! Sets the first edge and its range
void SetEdge2(const TopoDS_Edge& theEdge, const Standard_Real aT1, const Standard_Real aT2);
//! Sets the range for the second edge
void SetRange2(const IntTools_Range& theRange);
//! Sets the range for the second edge
void SetRange2(const Standard_Real aT1, const Standard_Real aT2);
//! Sets the Fuzzy value
void SetFuzzyValue (const Standard_Real theFuzz);
//! Performs the intersection between edges
Standard_EXPORT void Perform();
//! Returns TRUE if common part(s) is(are) found
Standard_Boolean IsDone() const;
//! Returns Fuzzy value
Standard_Real FuzzyValue() const;
//! Returns common parts
const IntTools_SequenceOfCommonPrts& CommonParts() const;
//! Sets the flag myQuickCoincidenceCheck
void UseQuickCoincidenceCheck (const Standard_Boolean bFlag) {
myQuickCoincidenceCheck=bFlag;
}
//! Returns the flag myQuickCoincidenceCheck
Standard_Boolean IsCoincidenceCheckedQuickly () {
return myQuickCoincidenceCheck;
}
protected:
//! Checks the data
void CheckData();
//! Prepares the data
Standard_EXPORT void Prepare();
//! Computes Line/Line intersection.
Standard_EXPORT void ComputeLineLine();
//! Intermediate function
Standard_EXPORT void FindSolutions (IntTools_SequenceOfRanges& theRanges1,
IntTools_SequenceOfRanges& theRanges2, Standard_Boolean& bSplit2);
//! Looking for the exact intersection ranges
Standard_EXPORT void FindSolutions (const IntTools_Range& theR1,
const IntTools_Range& theR2, const Bnd_Box& theBox2,
IntTools_SequenceOfRanges& theRanges1, IntTools_SequenceOfRanges& theRanges2);
//! Merges found solutions
Standard_EXPORT void MergeSolutions (const IntTools_SequenceOfRanges& theRanges1,
const IntTools_SequenceOfRanges& theRanges2, const Standard_Boolean bSplit2);
//! Looking for the range of the edge which is in the box
Standard_EXPORT static Standard_Boolean FindParameters(const BRepAdaptor_Curve& theBAC,
const Standard_Real aT1, const Standard_Real aT2, const Standard_Real theTol,
const Standard_Real theRes, const Standard_Real thePTol,
const Standard_Real theResCoeff, const Bnd_Box& theCBox,
Standard_Real& aTB1, Standard_Real& aTB2);
//! Checks if edges coincide on the ranges
Standard_EXPORT Standard_Integer CheckCoincidence (const Standard_Real aT11,
const Standard_Real aT12, const Standard_Real aT21, const Standard_Real aT22,
const Standard_Real theCriteria, const Standard_Real theCurveRes1);
//! Adds common part of the given type to myCommonParts
Standard_EXPORT void AddSolution (const Standard_Real aT11, const Standard_Real aT12,
const Standard_Real aT21, const Standard_Real aT22, const TopAbs_ShapeEnum theType);
//! Looking for the minimal distance between edges on the ranges
Standard_EXPORT void FindBestSolution (const Standard_Real aT11, const Standard_Real aT12,
const Standard_Real aT21, const Standard_Real aT22,
Standard_Real& aT1, Standard_Real& aT2);
//! Checks is there an intersection between edges on the given ranges
//! (for nearly conicident edges)
Standard_EXPORT Standard_Boolean IsIntersection (const Standard_Real aT11,
const Standard_Real aT12, const Standard_Real aT21, const Standard_Real aT22);
//! Checks if the edges are coincident really.
Standard_EXPORT Standard_Boolean IsCoincident();
TopoDS_Edge myEdge1;
TopoDS_Edge myEdge2;
Handle(Geom_Curve) myGeom1;
Handle(Geom_Curve) myGeom2;
BRepAdaptor_Curve myCurve1;
BRepAdaptor_Curve myCurve2;
Standard_Real myTol1;
Standard_Real myTol2;
Standard_Real myTol;
Standard_Real myFuzzyValue;
Standard_Real myRes1;
Standard_Real myRes2;
Standard_Real myResCoeff1;
Standard_Real myResCoeff2;
Standard_Real myPTol1;
Standard_Real myPTol2;
IntTools_Range myRange1;
IntTools_Range myRange2;
Standard_Boolean mySwap;
Standard_Integer myErrorStatus;
IntTools_SequenceOfCommonPrts myCommonParts;
//! Allows avoiding use Edge-Edge intersection
//! algorithm (i.e. speeding up the Boolean algorithm)
//! if the edges are coincided really.
//! If it is not evidently set of this flag should
//! be avoided (otherwise, the performance of
//! Boolean algorithm will be slower).
Standard_Boolean myQuickCoincidenceCheck;
private:
};
#include <IntTools_EdgeEdge.lxx>
#endif // _IntTools_EdgeEdge_HeaderFile