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:
parent
166d6cd76a
commit
9d109e39c2
@ -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)) {
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
18
tests/bugs/moddata_3/bug24028
Normal file
18
tests/bugs/moddata_3/bug24028
Normal 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
|
Loading…
x
Reference in New Issue
Block a user