#include <Geom2dAdaptor_Curve.hxx>
#include <Geom2dInt_GInter.hxx>
#include <Geom_Curve.hxx>
-#include <Geom_Surface.hxx>
+#include <Geom_ElementarySurface.hxx>
#include <GeomAdaptor_Surface.hxx>
#include <gp_Dir2d.hxx>
#include <gp_Lin2d.hxx>
// DTK-CKY 100531 : protection against very thin face
// Test "isclosed" should be filtered on the overall (non trimmed) surface, must be closed
Handle(Geom_Surface) theSurface = BRep_Tool::Surface(Face,myLoc);
- Standard_Real U0,U1,V0,V1,GU0 = 0.,GU1 = 0.,GV0 = 0.,GV1 = 0.;
- theSurface->Bounds(U0,U1,V0,V1);
- if (::Precision::IsInfinite (U0) || ::Precision::IsInfinite (U1) ||
- ::Precision::IsInfinite (V0) || ::Precision::IsInfinite (V1))
- BRepTools::UVBounds(Face, GU0, GU1, GV0, GV1);
- if (myUClosed) {
- if (::Precision::IsInfinite (V0)) V0 = GV0;
- if (::Precision::IsInfinite (V1)) V1 = GV1;
- gp_Pnt P0 = theSurface->Value(U0,(V0+V1)/2.);
- gp_Pnt P1 = theSurface->Value(U1,(V0+V1)/2.);
- if (P0.Distance(P1) > Precision::Confusion()*10)
- myUClosed = Standard_False;
- }
- if (myVClosed) {
- if (::Precision::IsInfinite (U0)) U0 = GU0;
- if (::Precision::IsInfinite (U1)) U1 = GU1;
- gp_Pnt P0 = theSurface->Value((U0+U1)/2.,V0);
- gp_Pnt P1 = theSurface->Value((U0+U1)/2.,V1);
- if (P0.Distance(P1) > Precision::Confusion()*10)
- myVClosed = Standard_False;
+ // avoid false detection of 'Closed' on very thin faces
+ if (theSurface->IsKind(STANDARD_TYPE(Geom_ElementarySurface))) {
+ myUClosed = myUClosed && theSurface->IsUClosed();
+ myVClosed = myVClosed && theSurface->IsVClosed();
+ } else {
+ Standard_Real U0,U1,V0,V1,GU0 = 0.,GU1 = 0.,GV0 = 0.,GV1 = 0.;
+ theSurface->Bounds(U0,U1,V0,V1);
+ if (::Precision::IsInfinite (U0) || ::Precision::IsInfinite (U1) ||
+ ::Precision::IsInfinite (V0) || ::Precision::IsInfinite (V1))
+ BRepTools::UVBounds(Face, GU0, GU1, GV0, GV1);
+ if (myUClosed) {
+ if (::Precision::IsInfinite (V0)) V0 = GV0;
+ if (::Precision::IsInfinite (V1)) V1 = GV1;
+ gp_Pnt P0 = theSurface->Value(U0,(V0+V1)/2.);
+ gp_Pnt P1 = theSurface->Value(U1,(V0+V1)/2.);
+ if (P0.Distance(P1) > Precision::Confusion()*10)
+ myUClosed = Standard_False;
+ }
+ if (myVClosed) {
+ if (::Precision::IsInfinite (U0)) U0 = GU0;
+ if (::Precision::IsInfinite (U1)) U1 = GU1;
+ gp_Pnt P0 = theSurface->Value((U0+U1)/2.,V0);
+ gp_Pnt P1 = theSurface->Value((U0+U1)/2.,V1);
+ if (P0.Distance(P1) > Precision::Confusion()*10)
+ myVClosed = Standard_False;
+ }
}
// DTK-CKY 100531 end