1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-08-29 14:00:49 +03:00

0024411: SplitShape produces shape with incorrectly parameterized periodic 3D curve

Implemented additional flag into Geom_TrimmedCurve to adjust or not the periodic curve inside the first period.

API of Geom2d_TrimmedCurve is changed according to Geom_TrimmedCurve.

Test-case for issue #24411
This commit is contained in:
azv
2014-12-25 17:57:55 +03:00
committed by bugmaster
parent 49b0c452e2
commit 8ac0cf5265
6 changed files with 70 additions and 38 deletions

View File

@@ -46,7 +46,8 @@ raises ConstructionError from Standard,
is
Create (C : Curve; U1, U2 : Real; Sense : Boolean = Standard_True)
Create (C : Curve; U1, U2 : Real; Sense : Boolean = Standard_True;
theAdjustPeriodic : Boolean = Standard_True)
returns TrimmedCurve
---Purpose : Constructs a trimmed curve from the basis curve C
-- which is limited between parameter values U1 and U2.
@@ -70,12 +71,14 @@ is
-- Warning: The trimmed curve is built from a copy of curve C.
-- Therefore, when C is modified, the trimmed curve
-- is not modified.
-- - If the basis curve is periodic, the bounds of the
-- trimmed curve may be different from U1 and U2
-- - If the basis curve is periodic and theAdjustPeriodic is True,
-- the bounds of the trimmed curve may be different from U1 and U2
-- if the parametric origin of the basis curve is within
-- the arc of the trimmed curve. In this case, the
-- modified parameter will be equal to U1 or U2
-- plus or minus the period.
-- When theAdjustPeriodic is False, parameters U1 and U2 will be
-- the same, without adjustment into the first period.
-- Exceptions
-- Standard_ConstructionError if:
-- - C is not periodic and U1 or U2 is outside the
@@ -109,18 +112,21 @@ is
-- the point of parameter U on this trimmed curve.
SetTrim (me : mutable; U1, U2 : Real; Sense : Boolean = Standard_True)
SetTrim (me : mutable; U1, U2 : Real; Sense : Boolean = Standard_True;
theAdjustPeriodic : Boolean = Standard_True)
---Purpose : Changes this trimmed curve, by redefining the
-- parameter values U1 and U2 which limit its basis curve.
-- Note: If the basis curve is periodic, the trimmed curve
-- has the same orientation as the basis curve if Sense
-- is true (default value) or the opposite orientation if Sense is false.
-- Warning
-- If the basis curve is periodic, the bounds of the
-- trimmed curve may be different from U1 and U2 if the
-- If the basis curve is periodic and theAdjustPeriodic is True,
-- the bounds of the trimmed curve may be different from U1 and U2 if the
-- parametric origin of the basis curve is within the arc of
-- the trimmed curve. In this case, the modified
-- parameter will be equal to U1 or U2 plus or minus the period.
-- When theAdjustPeriodic is False, parameters U1 and U2 will be
-- the same, without adjustment into the first period.
-- Exceptions
-- Standard_ConstructionError if:
-- - the basis curve is not periodic, and either U1 or U2

View File

@@ -60,9 +60,10 @@ Handle(Geom_Geometry) Geom_TrimmedCurve::Copy () const {
//=======================================================================
Geom_TrimmedCurve::Geom_TrimmedCurve (const Handle(Geom_Curve)& C,
const Standard_Real U1,
const Standard_Real U2,
const Standard_Boolean Sense) :
const Standard_Real U1,
const Standard_Real U2,
const Standard_Boolean Sense,
const Standard_Boolean theAdjustPeriodic) :
uTrim1 (U1),
uTrim2 (U2)
{
@@ -73,7 +74,7 @@ Geom_TrimmedCurve::Geom_TrimmedCurve (const Handle(Geom_Curve)& C,
else
basisCurve = Handle(Curve)::DownCast(C->Copy());
SetTrim(U1,U2,Sense);
SetTrim(U1, U2, Sense, theAdjustPeriodic);
}
//=======================================================================
@@ -86,7 +87,7 @@ void Geom_TrimmedCurve::Reverse ()
Standard_Real U1 = basisCurve->ReversedParameter(uTrim2);
Standard_Real U2 = basisCurve->ReversedParameter(uTrim1);
basisCurve->Reverse();
SetTrim(U1,U2);
SetTrim(U1, U2, Standard_True, Standard_False);
}
@@ -108,8 +109,9 @@ Standard_Real Geom_TrimmedCurve::ReversedParameter
//=======================================================================
void Geom_TrimmedCurve::SetTrim (const Standard_Real U1,
const Standard_Real U2,
const Standard_Boolean Sense)
const Standard_Real U2,
const Standard_Boolean Sense,
const Standard_Boolean theAdjustPeriodic)
{
Standard_Boolean sameSense = Standard_True;
if (U1 == U2)
@@ -125,9 +127,10 @@ void Geom_TrimmedCurve::SetTrim (const Standard_Real U1,
// set uTrim2 in the range uTrim1 , uTrim1 + Period()
uTrim1 = U1;
uTrim2 = U2;
ElCLib::AdjustPeriodic(Udeb, Ufin,
Min(Abs(uTrim2-uTrim1)/2,Precision::PConfusion()),
uTrim1, uTrim2);
if (theAdjustPeriodic)
ElCLib::AdjustPeriodic(Udeb, Ufin,
Min(Abs(uTrim2-uTrim1)/2,Precision::PConfusion()),
uTrim1, uTrim2);
}
else {
@@ -334,7 +337,7 @@ void Geom_TrimmedCurve::Transform (const Trsf& T)
basisCurve->Transform (T);
Standard_Real U1 = basisCurve->TransformedParameter(uTrim1,T);
Standard_Real U2 = basisCurve->TransformedParameter(uTrim2,T);
SetTrim(U1,U2);
SetTrim(U1, U2, Standard_True, Standard_False);
}