mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-04-03 17:56:21 +03:00
0029430: [Regression] Curve evaluation at boundary point.
Before the fix, BRepAdaptor_CompCurve considered the input wire to be periodic with period LastParameter()-FirstParameter(). Now, method IsPeriodic will always return FALSE because it is impossible to obtain correspondence between the members of BRepAdaptor_CompCurve class and its periodicity status. New behavior has been documented in upgrade-guide.
This commit is contained in:
parent
b008680dc0
commit
51e75dba6c
@ -1437,3 +1437,10 @@ The Error/Warning reporting system of the algorithms in Boolean Component (in al
|
||||
The methods returning the status of errors and warnings of the algorithms (ErrorStatus() and WarningStatus()) have been removed.
|
||||
Instead use methods HasErrors() and HasWarnings() to check for presence of errors and warnings, respectively.
|
||||
The full list of errors and warnings, with associated data such as problematic sub-shapes, can be obtained by method GetReport().
|
||||
|
||||
@section upgrade_occt730 Upgrade to OCCT 7.3.0
|
||||
|
||||
@subsection upgrade_730_BRepAdaptor_CompCurve Changes in BRepAdaptor_CompCurve
|
||||
|
||||
The method BRepAdaptor_CompCurve::SetPeriodic has been eliminated.
|
||||
Since new version, the method BRepAdaptor_CompCurve::IsPeriodic() will always return FALSE. Earlier, it could return TRUE in case if the wire contained only one edge based on periodic curve.
|
||||
|
@ -46,11 +46,9 @@ BRepAdaptor_CompCurve::BRepAdaptor_CompCurve()
|
||||
: TFirst (0.0),
|
||||
TLast (0.0),
|
||||
PTol (0.0),
|
||||
myPeriod(0.0),
|
||||
CurIndex(-1),
|
||||
Forward (Standard_False),
|
||||
IsbyAC (Standard_False),
|
||||
Periodic(Standard_False)
|
||||
IsbyAC (Standard_False)
|
||||
{
|
||||
}
|
||||
|
||||
@ -60,11 +58,9 @@ BRepAdaptor_CompCurve::BRepAdaptor_CompCurve(const TopoDS_Wire& theWire,
|
||||
TFirst (0.0),
|
||||
TLast (0.0),
|
||||
PTol (0.0),
|
||||
myPeriod(0.0),
|
||||
CurIndex(-1),
|
||||
Forward (Standard_False),
|
||||
IsbyAC (theIsAC),
|
||||
Periodic(Standard_False)
|
||||
IsbyAC (theIsAC)
|
||||
{
|
||||
Initialize(theWire, theIsAC);
|
||||
}
|
||||
@ -78,11 +74,9 @@ BRepAdaptor_CompCurve::BRepAdaptor_CompCurve(const TopoDS_Wire& theWire,
|
||||
TFirst (theFirst),
|
||||
TLast (theLast),
|
||||
PTol (theTolerance),
|
||||
myPeriod(0.0),
|
||||
CurIndex(-1),
|
||||
Forward (Standard_False),
|
||||
IsbyAC (theIsAC),
|
||||
Periodic(Standard_False)
|
||||
IsbyAC (theIsAC)
|
||||
{
|
||||
Initialize(theWire, theIsAC, theFirst, theLast, theTolerance);
|
||||
}
|
||||
@ -144,13 +138,6 @@ BRepAdaptor_CompCurve::BRepAdaptor_CompCurve(const TopoDS_Wire& theWire,
|
||||
|
||||
TFirst = 0;
|
||||
TLast = myKnots->Value(myKnots->Length());
|
||||
myPeriod = TLast - TFirst;
|
||||
if (NbEdge == 1) {
|
||||
Periodic = myCurves->Value(1).IsPeriodic();
|
||||
}
|
||||
else {
|
||||
Periodic = Standard_False;
|
||||
}
|
||||
}
|
||||
|
||||
void BRepAdaptor_CompCurve::Initialize(const TopoDS_Wire& W,
|
||||
@ -200,15 +187,6 @@ BRepAdaptor_CompCurve::BRepAdaptor_CompCurve(const TopoDS_Wire& theWire,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void BRepAdaptor_CompCurve::SetPeriodic(const Standard_Boolean isPeriodic)
|
||||
{
|
||||
if (myWire.Closed()) {
|
||||
Periodic = isPeriodic;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const TopoDS_Wire& BRepAdaptor_CompCurve::Wire() const
|
||||
{
|
||||
return myWire;
|
||||
@ -308,13 +286,13 @@ const TopoDS_Wire& BRepAdaptor_CompCurve::Wire() const
|
||||
|
||||
Standard_Boolean BRepAdaptor_CompCurve::IsPeriodic() const
|
||||
{
|
||||
return Periodic;
|
||||
return Standard_False;
|
||||
|
||||
}
|
||||
|
||||
Standard_Real BRepAdaptor_CompCurve::Period() const
|
||||
{
|
||||
return myPeriod;
|
||||
return (TLast - TFirst);
|
||||
}
|
||||
|
||||
gp_Pnt BRepAdaptor_CompCurve::Value(const Standard_Real U) const
|
||||
@ -475,12 +453,6 @@ const TopoDS_Wire& BRepAdaptor_CompCurve::Wire() const
|
||||
|
||||
|
||||
Wtest = W+Eps; //Offset to discriminate the nodes
|
||||
if(Periodic){
|
||||
Wtest = ElCLib::InPeriod(Wtest,
|
||||
0,
|
||||
myPeriod);
|
||||
W = Wtest-Eps;
|
||||
}
|
||||
|
||||
// Find the index
|
||||
Standard_Boolean Trouve = Standard_False;
|
||||
|
@ -53,6 +53,9 @@ class Geom_BSplineCurve;
|
||||
//! of the BRep topology like a 3D curve.
|
||||
//! Warning: With this class of curve, C0 and C1 continuities
|
||||
//! are not assumed. So be carful with some algorithm!
|
||||
//! Please note that BRepAdaptor_CompCurve cannot be
|
||||
//! periodic curve at all (even if it contains single
|
||||
//! periodic edge).
|
||||
class BRepAdaptor_CompCurve : public Adaptor3d_Curve
|
||||
{
|
||||
public:
|
||||
@ -75,10 +78,6 @@ public:
|
||||
//! Sets wire <W> and trimmed parameter.
|
||||
Standard_EXPORT void Initialize (const TopoDS_Wire& W, const Standard_Boolean KnotByCurvilinearAbcissa, const Standard_Real First, const Standard_Real Last, const Standard_Real Tol);
|
||||
|
||||
//! Set the flag Periodic.
|
||||
//! Warning: This method has no effect if the wire is not closed
|
||||
Standard_EXPORT void SetPeriodic (const Standard_Boolean Periodic);
|
||||
|
||||
//! Returns the wire.
|
||||
Standard_EXPORT const TopoDS_Wire& Wire() const;
|
||||
|
||||
@ -197,15 +196,11 @@ private:
|
||||
Standard_Real TFirst;
|
||||
Standard_Real TLast;
|
||||
Standard_Real PTol;
|
||||
Standard_Real myPeriod;
|
||||
Handle(BRepAdaptor_HArray1OfCurve) myCurves;
|
||||
Handle(TColStd_HArray1OfReal) myKnots;
|
||||
Standard_Integer CurIndex;
|
||||
Standard_Boolean Forward;
|
||||
Standard_Boolean IsbyAC;
|
||||
Standard_Boolean Periodic;
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
@ -385,10 +385,8 @@ BRepFill_PipeShell::BRepFill_PipeShell(const TopoDS_Wire& Spine)
|
||||
if (Affich)
|
||||
DBRep::Set("theguide", TheGuide);
|
||||
#endif
|
||||
// transform the guide in a single curve (periodic if posssible)
|
||||
Handle(BRepAdaptor_HCompCurve) Guide =
|
||||
new (BRepAdaptor_HCompCurve) (TheGuide);
|
||||
Guide->ChangeCurve().SetPeriodic(Standard_True);
|
||||
// transform the guide in a single curve
|
||||
Handle(BRepAdaptor_HCompCurve) Guide = new (BRepAdaptor_HCompCurve) (TheGuide);
|
||||
|
||||
if (CurvilinearEquivalence) { // trihedron by curvilinear reduced abscissa
|
||||
if (KeepContact == BRepFill_Contact ||
|
||||
|
@ -2579,6 +2579,39 @@ static Standard_Integer OCC30708_2 (Draw_Interpretor& di, Standard_Integer, cons
|
||||
return 0;
|
||||
}
|
||||
|
||||
#include <GC_MakeArcOfCircle.hxx>
|
||||
#include <BRepAdaptor_CompCurve.hxx>
|
||||
#include <gp_Circ.hxx>
|
||||
//=======================================================================
|
||||
//function : OCC29430
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
static Standard_Integer OCC29430(Draw_Interpretor& theDI,
|
||||
Standard_Integer /*theNArg*/,
|
||||
const char** theArgVal)
|
||||
{
|
||||
const Standard_Real r45 = M_PI / 4.0, r225 = 3.0*M_PI / 4.0;
|
||||
|
||||
GC_MakeArcOfCircle arcMaker(gp_Circ(gp_Ax2(gp_Pnt(0.0, 0.0, 0.0), gp_Dir(0.0, 0.0, 1.0), gp_Dir(1.0, 0.0, 0.0)), 1.0), r45, r225, Standard_True);
|
||||
BRepBuilderAPI_MakeEdge edgeMaker(arcMaker.Value());
|
||||
BRepBuilderAPI_MakeWire wireMaker(edgeMaker.Edge());
|
||||
const TopoDS_Wire circle = wireMaker.Wire();
|
||||
|
||||
DBRep::Set(theArgVal[1], circle);
|
||||
|
||||
BRepAdaptor_CompCurve curve(circle);
|
||||
theDI << "Curve.FirstParameter() = " << curve.FirstParameter() << "\n";
|
||||
theDI << "Curve.LastParameter() = " << curve.LastParameter() << "\n";
|
||||
theDI << "Curve.Period() = " << (curve.IsPeriodic()? curve.Period() : 0.0) << "\n";
|
||||
const gp_Pnt aStartPt = curve.Value(curve.FirstParameter());
|
||||
const gp_Pnt anEndPt = curve.Value(curve.LastParameter());
|
||||
|
||||
DrawTrSurf::Set(theArgVal[2], aStartPt);
|
||||
DrawTrSurf::Set(theArgVal[3], anEndPt);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void QABugs::Commands_20(Draw_Interpretor& theCommands) {
|
||||
const char *group = "QABugs";
|
||||
|
||||
@ -2614,5 +2647,9 @@ void QABugs::Commands_20(Draw_Interpretor& theCommands) {
|
||||
theCommands.Add ("OCC30708_2", "Tests initialization of the BRepLib_MakeWire with null shape",
|
||||
__FILE__, OCC30708_2, group);
|
||||
|
||||
theCommands.Add("OCC29430", "OCC29430 <result wire> "
|
||||
"<result first point> <result last point>",
|
||||
__FILE__, OCC29430, group);
|
||||
|
||||
return;
|
||||
}
|
||||
|
46
tests/bugs/modalg_7/bug29430
Normal file
46
tests/bugs/modalg_7/bug29430
Normal file
@ -0,0 +1,46 @@
|
||||
puts "========"
|
||||
puts "OCC29430"
|
||||
puts "========"
|
||||
puts ""
|
||||
#################################################
|
||||
# [Regression] Curve evaluation at boundary point.
|
||||
#################################################
|
||||
|
||||
pload QAcommands
|
||||
|
||||
# After launching the command below we will obtain
|
||||
# some wire (stored in "result" variable) containing
|
||||
# a single edge based on arc of circle and its first and last
|
||||
# 3D-points (p1 and p2 correspondingly) taken from
|
||||
# composite curve (BRepAdaptor_CompCurve) built on this wire.
|
||||
|
||||
OCC29430 result p1 p2
|
||||
|
||||
vertex v1 p1
|
||||
vertex v2 p2
|
||||
|
||||
explode result v
|
||||
|
||||
# Now, let's check
|
||||
# 1. whether p1 and p2 match the vertices of the wire;
|
||||
# 2. whether p1 and p2 are different points.
|
||||
|
||||
distmini d11 result_1 v1
|
||||
distmini d12 result_1 v2
|
||||
distmini d21 result_2 v1
|
||||
distmini d22 result_2 v2
|
||||
distmini dv12 v1 v2
|
||||
|
||||
|
||||
if { ([dval d11_val] > 1.0e-7) && ([dval d21_val] > 1.0e-7) } {
|
||||
puts "Error: Start point of the wire does not match any its vertex."
|
||||
}
|
||||
if { ([dval d12_val] > 1.0e-7) && ([dval d22_val] > 1.0e-7) } {
|
||||
puts "Error: End point of the wire does not match any its vertex."
|
||||
}
|
||||
|
||||
if { [dval dv12_val] < 1.0e-7 } {
|
||||
puts "Error: Start and End points of the wire are the same."
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user