#include <gp_Trsf.hxx>
#include <gp_Trsf2d.hxx>
+#include <Geom_BSplineSurface.hxx>
#include <Geom_CartesianPoint.hxx>
#include <Geom_ConicalSurface.hxx>
#include <Geom_Curve.hxx>
#include <Precision.hxx>
+#include <ShapeAnalysis.hxx>
+
#include <TColStd_HSequenceOfTransient.hxx>
#include <TopoDS.hxx>
}
else Curve2d = Handle(Geom2d_Curve)::DownCast(Curve2d->Copy());
+ //shift pcurves on periodic BSpline surfaces (issue 26138)
+ if (Surf->IsKind(STANDARD_TYPE(Geom_BSplineSurface))) {
+ Handle(Geom_BSplineSurface) aBSpline = Handle(Geom_BSplineSurface)::DownCast(Surf);
+ Standard_Real uShift = 0., vShift = 0.;
+ Standard_Real U0, U1, V0, V1;
+ Surf->Bounds(U0, U1, V0, V1);
+ if (aBSpline->IsUPeriodic() && Abs(Ufirst - U0) > Precision::PConfusion()) {
+ uShift = ShapeAnalysis::AdjustToPeriod(Ufirst, U0, U1);
+ }
+ if (aBSpline->IsVPeriodic() && Abs(Vfirst - V0) > Precision::PConfusion()) {
+ vShift = ShapeAnalysis::AdjustToPeriod(Vfirst, V0, V1);
+ }
+ if (Abs(uShift) > Precision::PConfusion() || Abs(vShift) > Precision::PConfusion()) {
+ gp_Trsf2d TR;
+ TR.SetTranslation(gp_Pnt2d(0.,0.),gp_Pnt2d(uShift,vShift));
+ Curve2d = Handle(Geom2d_Curve)::DownCast(Curve2d->Transformed(TR));
+ }
+ }
+
if (!analyticMode&&((Surf->IsKind(STANDARD_TYPE(Geom_CylindricalSurface))) ||
(Surf->IsKind(STANDARD_TYPE(Geom_ConicalSurface))) ||
(Surf->IsKind(STANDARD_TYPE(Geom_SphericalSurface))))) {