From 9d109e39c283fb29655a4f88756dc697d11f6af7 Mon Sep 17 00:00:00 2001 From: nbv Date: Mon, 24 Jun 2013 10:18:18 +0400 Subject: [PATCH] 0024028: It is impossible to create a face based on Geom_RectangularTrimmedSurface by standard methods 1. Trimmed Surfaces were replaced with bases for *.igs and *.stp file format. BRepLib_MakeFace method sets the TRIMMED surface of Geom_RectangularTrimmedSurface in created face. 2. Adding test case for this fix --- src/BRepLib/BRepLib_MakeFace.cxx | 13 ++-- src/IGESToBRep/IGESToBRep_TopoSurface.cxx | 79 ++++++++++++++--------- src/StepToTopoDS/StepToTopoDS_Builder.cxx | 22 ++++++- tests/bugs/moddata_3/bug24028 | 18 ++++++ 4 files changed, 94 insertions(+), 38 deletions(-) create mode 100644 tests/bugs/moddata_3/bug24028 diff --git a/src/BRepLib/BRepLib_MakeFace.cxx b/src/BRepLib/BRepLib_MakeFace.cxx index 0366b2164e..2e9f8cbcb0 100755 --- a/src/BRepLib/BRepLib_MakeFace.cxx +++ b/src/BRepLib/BRepLib_MakeFace.cxx @@ -508,24 +508,23 @@ void BRepLib_MakeFace::Init(const Handle(Geom_Surface)& SS, Standard_Real umin,umax,vmin,vmax,T; - Handle(Geom_Surface) S = SS; + Handle(Geom_Surface) S = SS, BS = SS; Handle(Geom_RectangularTrimmedSurface) RS = Handle(Geom_RectangularTrimmedSurface)::DownCast(S); if (!RS.IsNull()) - S = RS->BasisSurface(); - + BS = RS->BasisSurface(); Standard_Boolean OffsetSurface = - (S->DynamicType() == STANDARD_TYPE(Geom_OffsetSurface)); - + (BS->DynamicType() == STANDARD_TYPE(Geom_OffsetSurface)); + // adjust periodical surface or reordonate // check if the values are in the natural range Standard_Real epsilon = Precision::PConfusion(); - S->Bounds(umin,umax,vmin,vmax); + BS->Bounds(umin,umax,vmin,vmax); if (OffsetSurface) { - Handle(Geom_OffsetSurface) OS = Handle(Geom_OffsetSurface)::DownCast(S); + Handle(Geom_OffsetSurface) OS = Handle(Geom_OffsetSurface)::DownCast(BS); Handle(Geom_Surface) Base = OS->BasisSurface(); if (Base->DynamicType() == STANDARD_TYPE(Geom_SurfaceOfLinearExtrusion)) { diff --git a/src/IGESToBRep/IGESToBRep_TopoSurface.cxx b/src/IGESToBRep/IGESToBRep_TopoSurface.cxx index 06cd79568c..de29295580 100755 --- a/src/IGESToBRep/IGESToBRep_TopoSurface.cxx +++ b/src/IGESToBRep/IGESToBRep_TopoSurface.cxx @@ -765,33 +765,50 @@ TopoDS_Shape IGESToBRep_TopoSurface::TransferSurfaceOfRevolution // (BRepPrimAPI_MakeRevol replace surface of revolution by plane then 3D and 2D curves are inconsistent; // and 3D is ignored. As result shape is rectangle instead circle shape. Handle(Geom_Curve) aBasisCurve; + { - try { - OCC_CATCH_SIGNALS - if (extractCurve3d(generatrix, aBasisCurve)) { - Handle(Geom_Surface) aResultSurf = new Geom_SurfaceOfRevolution(aBasisCurve, revolAxis); - if ( !aResultSurf.IsNull() && !IsFullAngle ) { - Standard_Real VF = aBasisCurve->FirstParameter(); - Standard_Real VL = aBasisCurve->LastParameter(); - // PTV 29.08.2002 begin of OCC663 Trim surface by correct parameters - Standard_Real UF = 0; - Standard_Real UL = endAngle - startAngle;; - //aResultSurf = new Geom_RectangularTrimmedSurface(aResultSurf, startAngle, endAngle, VF, VL); - aResultSurf = new Geom_RectangularTrimmedSurface(aResultSurf, UF, UL, VF, VL); - // PTV 29.08.2002 end of OCC663 - } - if (!aResultSurf.IsNull()) { - BRepBuilderAPI_MakeFace aMakeF(aResultSurf, Precision::Confusion()); - if (aMakeF.IsDone()) res = aMakeF.Face(); - } + try + { + OCC_CATCH_SIGNALS + if (extractCurve3d(generatrix, aBasisCurve)) + { + BRepBuilderAPI_MakeFace aMakeF; + Handle(Geom_Surface) aResultSurf = + new Geom_SurfaceOfRevolution(aBasisCurve, revolAxis); + + if ( !aResultSurf.IsNull()) + { + if (!IsFullAngle) + { + const Standard_Real VF = aBasisCurve->FirstParameter(); + const Standard_Real VL = aBasisCurve->LastParameter(); + + // PTV 29.08.2002 begin of OCC663 Trim surface by correct parameters + const Standard_Real UF = 0; + const Standard_Real UL = endAngle - startAngle; + // PTV 29.08.2002 end of OCC663 + + aMakeF = BRepBuilderAPI_MakeFace(aResultSurf, UF, + UL, VF, VL, Precision::Confusion()); + }//if (!IsFullAngle) + else + { + aMakeF = BRepBuilderAPI_MakeFace(aResultSurf, Precision::Confusion()); + } + + if (aMakeF.IsDone()) + res = aMakeF.Face(); + }//if ( !aResultSurf.IsNull()) + }//if (extractCurve3d(generatrix, aBasisCurve)) } - } - catch (Standard_Failure) { + catch (Standard_Failure) + { #ifdef DEB - cout << "Warning: IgesToBRep_TopoSurface::TransferSurfaceOfRevolution(): exception by Geom: "; - Standard_Failure::Caught()->Print ( cout ); cout << endl; + cout << "Warning: IgesToBRep_TopoSurface::" + "TransferSurfaceOfRevolution(): exception by Geom: "; + Standard_Failure::Caught()->Print ( cout ); cout << endl; #endif - } + }//catch (Standard_Failure) } if ( res.IsNull() ) { @@ -903,13 +920,17 @@ TopoDS_Shape IGESToBRep_TopoSurface::TransferTabulatedCylinder Handle(Geom_Surface) aResultSurf = new Geom_SurfaceOfLinearExtrusion(aBasisCurve, dir); if (!aResultSurf.IsNull()) { - aResultSurf = - new Geom_RectangularTrimmedSurface(aResultSurf, - aBasisCurve->FirstParameter(), + //aResultSurf = + // new Geom_RectangularTrimmedSurface(aResultSurf, + // aBasisCurve->FirstParameter(), + // aBasisCurve->LastParameter(), + // 0., dir.Magnitude() ); + BRepBuilderAPI_MakeFace aMakeF(aResultSurf, aBasisCurve->FirstParameter(), aBasisCurve->LastParameter(), - 0., dir.Magnitude() ); - BRepBuilderAPI_MakeFace aMakeF(aResultSurf, Precision::Confusion()); - if (aMakeF.IsDone()) res = aMakeF.Face(); + 0., dir.Magnitude(), + Precision::Confusion()); + if (aMakeF.IsDone()) + res = aMakeF.Face(); } } } diff --git a/src/StepToTopoDS/StepToTopoDS_Builder.cxx b/src/StepToTopoDS/StepToTopoDS_Builder.cxx index c947a3b337..1b1a1ee6ec 100755 --- a/src/StepToTopoDS/StepToTopoDS_Builder.cxx +++ b/src/StepToTopoDS/StepToTopoDS_Builder.cxx @@ -70,6 +70,8 @@ #include #include +#include + #include #include #include @@ -701,8 +703,24 @@ static TopoDS_Face TranslateBoundedSurf (const Handle(StepGeom_Surface) &surf, if (!StepToGeom_MakeSurface::Convert(surf,theSurf) || //:i6: protection !theSurf->IsKind(STANDARD_TYPE(Geom_BoundedSurface))) return res; - //gka 11.01.99 file PRO7755.stp entity #2018 surface #1895: error BRepLib_MakeFace func IsDegenerated - BRepBuilderAPI_MakeFace myMkFace(theSurf, TolDegen); + + BRepBuilderAPI_MakeFace myMkFace; + + Handle(Geom_RectangularTrimmedSurface) RS = + Handle(Geom_RectangularTrimmedSurface)::DownCast(theSurf); + + if (!RS.IsNull()) + { + Standard_Real umin, umax, vmin, vmax; + theSurf->Bounds(umin, umax, vmin, vmax); + + myMkFace = BRepBuilderAPI_MakeFace(RS->BasisSurface(), umin, umax, vmin, vmax, TolDegen); + } + else + { + myMkFace = BRepBuilderAPI_MakeFace(theSurf, TolDegen); + } + return myMkFace.Face(); } diff --git a/tests/bugs/moddata_3/bug24028 b/tests/bugs/moddata_3/bug24028 new file mode 100644 index 0000000000..49ad2921da --- /dev/null +++ b/tests/bugs/moddata_3/bug24028 @@ -0,0 +1,18 @@ +puts "================" +puts "CR24028" +puts "================" +puts "" +####################################################################### +# It is impossible to create a face based on Geom_RectangularTrimmedSurface by standard methods +####################################################################### + +beziercurve cc 3 0 0 -10 1 20 0 0 10 0 0 10 1 +revsurf ss cc 0 0 0 0 0 1 +trimu ts ss 0 pi + +mkface result ts + +set square 1222.58 + + +set 2dviewer 0