1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-08-14 13:30:48 +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

@@ -43,7 +43,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 :
-- Creates a trimmed curve from the basis curve C limited between
@@ -70,9 +71,9 @@ is
-- built with a copy of the curve C. So when C is modified the
-- TrimmedCurve is not modified
-- Warnings :
-- If <C> is periodic, parametrics bounds of the TrimmedCurve,
-- can be different to [<U1>;<U2>}, if <U1> or <U2> are not in the
-- principal period.
-- If <C> is periodic and <theAdjustPeriodic> is True, parametrics
-- bounds of the TrimmedCurve, can be different to [<U1>;<U2>},
-- if <U1> or <U2> are not in the principal period.
-- Include :
-- For more explanation see the scheme given with this class.
-- Raises ConstructionError the C is not periodic and U1 or U2 are out of
@@ -105,18 +106,20 @@ is
-- returns UFirst + ULast - U
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.
-- If theAdjustPeriodic is False, parameters U1 and U2 will stay unchanged.
-- Exceptions
-- Standard_ConstructionError if:
-- - the basis curve is not periodic, and either U1 or U2

View File

@@ -62,9 +62,10 @@ Handle(Geom2d_Geometry) Geom2d_TrimmedCurve::Copy () const
//=======================================================================
Geom2d_TrimmedCurve::Geom2d_TrimmedCurve (const Handle(Geom2d_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)
{
@@ -76,7 +77,7 @@ Geom2d_TrimmedCurve::Geom2d_TrimmedCurve (const Handle(Geom2d_Curve)& C,
else
basisCurve = Handle(Curve)::DownCast(C->Copy());
SetTrim(U1,U2,Sense);
SetTrim(U1, U2, Sense, theAdjustPeriodic);
}
//=======================================================================
@@ -89,7 +90,7 @@ void Geom2d_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);
}
//=======================================================================
@@ -107,9 +108,10 @@ Standard_Real Geom2d_TrimmedCurve::ReversedParameter( const Standard_Real U) con
//purpose :
//=======================================================================
void Geom2d_TrimmedCurve::SetTrim (const Standard_Real U1,
const Standard_Real U2,
const Standard_Boolean Sense)
void Geom2d_TrimmedCurve::SetTrim (const Standard_Real U1,
const Standard_Real U2,
const Standard_Boolean Sense,
const Standard_Boolean theAdjustPeriodic)
{
Standard_Boolean sameSense = Standard_True;
if (U1 == U2)
@@ -124,10 +126,11 @@ void Geom2d_TrimmedCurve::SetTrim (const Standard_Real U1,
// set uTrim1 in the range Udeb , Ufin
// 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);
uTrim2 = U2;
if (theAdjustPeriodic)
ElCLib::AdjustPeriodic(Udeb, Ufin,
Min(Abs(uTrim2-uTrim1)/2,Precision::PConfusion()),
uTrim1, uTrim2);
}
else {
if (U1 < U2) {
@@ -316,7 +319,7 @@ void Geom2d_TrimmedCurve::Transform (const Trsf2d& 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);
}
//=======================================================================