1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-05-16 10:54:53 +03:00

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
This commit is contained in:
nbv 2013-06-24 10:18:18 +04:00 committed by jgv
parent 166d6cd76a
commit 9d109e39c2
4 changed files with 94 additions and 38 deletions

View File

@ -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)) {

View File

@ -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();
}
}
}

View File

@ -70,6 +70,8 @@
#include <TopoDS_Compound.hxx>
#include <TopExp_Explorer.hxx>
#include <Geom_RectangularTrimmedSurface.hxx>
#include <ShapeFix_ShapeTolerance.hxx>
#include <StepShape_ConnectedEdgeSet.hxx>
#include <StepShape_EdgeBasedWireframeModel.hxx>
@ -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();
}

View File

@ -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