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
GAS.Load(Plane);
Handle(Geom_Curve) ProjOnPlane =
- GeomProjLib::ProjectOnPlane(new Geom_TrimmedCurve(C3d,f,l),
+ GeomProjLib::ProjectOnPlane(new Geom_TrimmedCurve(C3d,f,l,Standard_True,Standard_False),
Plane,
Plane->Position().Direction(),
Standard_True);
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.
-- 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
-- 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
//=======================================================================
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)
{
else
basisCurve = Handle(Curve)::DownCast(C->Copy());
- SetTrim(U1,U2,Sense);
+ SetTrim(U1, U2, Sense, theAdjustPeriodic);
}
//=======================================================================
Standard_Real U1 = basisCurve->ReversedParameter(uTrim2);
Standard_Real U2 = basisCurve->ReversedParameter(uTrim1);
basisCurve->Reverse();
- SetTrim(U1,U2);
+ SetTrim(U1, U2, Standard_True, Standard_False);
}
//=======================================================================
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)
// 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 {
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);
}
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
-- 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
-- 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
//=======================================================================
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)
{
else
basisCurve = Handle(Curve)::DownCast(C->Copy());
- SetTrim(U1,U2,Sense);
+ SetTrim(U1, U2, Sense, theAdjustPeriodic);
}
//=======================================================================
Standard_Real U1 = basisCurve->ReversedParameter(uTrim2);
Standard_Real U2 = basisCurve->ReversedParameter(uTrim1);
basisCurve->Reverse();
- SetTrim(U1,U2);
+ SetTrim(U1, U2, Standard_True, Standard_False);
}
//=======================================================================
//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)
// 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) {
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);
}
//=======================================================================
--- /dev/null
+puts "========"
+puts "OCC24411"
+puts "========"
+puts ""
+##############################################################################
+# SplitShape produces shape with incorrectly parameterized periodic 3D curve
+##############################################################################
+
+restore [locate_data_file OCC24411_bug-ss.brep] s
+
+explode s
+splitshape r s_1 s_1 s_2
+plane pl 0 0 0 0 0 1
+mkface f pl
+foreach e [explode r e] {
+ catch {pcurve c_$e $e f}
+}