diff --git a/src/BRep/BRep_Tool.cxx b/src/BRep/BRep_Tool.cxx index af654bfee7..930c7dc417 100644 --- a/src/BRep/BRep_Tool.cxx +++ b/src/BRep/BRep_Tool.cxx @@ -350,7 +350,7 @@ Handle(Geom2d_Curve) BRep_Tool::CurveOnSurface(const TopoDS_Edge& E, 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); diff --git a/src/Geom/Geom_TrimmedCurve.cdl b/src/Geom/Geom_TrimmedCurve.cdl index bf632273c1..2bb95d97e6 100644 --- a/src/Geom/Geom_TrimmedCurve.cdl +++ b/src/Geom/Geom_TrimmedCurve.cdl @@ -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 diff --git a/src/Geom/Geom_TrimmedCurve.cxx b/src/Geom/Geom_TrimmedCurve.cxx index 24e3f0fcbf..eac903311f 100644 --- a/src/Geom/Geom_TrimmedCurve.cxx +++ b/src/Geom/Geom_TrimmedCurve.cxx @@ -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); } diff --git a/src/Geom2d/Geom2d_TrimmedCurve.cdl b/src/Geom2d/Geom2d_TrimmedCurve.cdl index e79cabcbb3..11b52ca6dc 100644 --- a/src/Geom2d/Geom2d_TrimmedCurve.cdl +++ b/src/Geom2d/Geom2d_TrimmedCurve.cdl @@ -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 is periodic, parametrics bounds of the TrimmedCurve, - -- can be different to [;}, if or are not in the - -- principal period. + -- If is periodic and is True, parametrics + -- bounds of the TrimmedCurve, can be different to [;}, + -- if or 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 diff --git a/src/Geom2d/Geom2d_TrimmedCurve.cxx b/src/Geom2d/Geom2d_TrimmedCurve.cxx index 4d02019fdc..ed19ec5c3c 100644 --- a/src/Geom2d/Geom2d_TrimmedCurve.cxx +++ b/src/Geom2d/Geom2d_TrimmedCurve.cxx @@ -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); } //======================================================================= diff --git a/tests/bugs/moddata_3/bug24411 b/tests/bugs/moddata_3/bug24411 new file mode 100644 index 0000000000..755f5e482e --- /dev/null +++ b/tests/bugs/moddata_3/bug24411 @@ -0,0 +1,17 @@ +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} +}