mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-04-03 17:56:21 +03:00
OCC22361 Incorrect result of BRepOffsetAPI_MakePipeShell algorithm: it tries to build conical surface between two non-coaxial circles
This commit is contained in:
parent
d73257411c
commit
98dbbeb433
@ -21,8 +21,8 @@ uses
|
|||||||
Array1OfVec from TColgp,
|
Array1OfVec from TColgp,
|
||||||
Array1OfInteger from TColStd,
|
Array1OfInteger from TColStd,
|
||||||
Array1OfReal from TColStd,
|
Array1OfReal from TColStd,
|
||||||
SequenceOfReal from TColStd
|
SequenceOfReal from TColStd,
|
||||||
|
SequenceOfTrsf from GeomFill
|
||||||
|
|
||||||
raises
|
raises
|
||||||
OutOfRange
|
OutOfRange
|
||||||
@ -56,8 +56,9 @@ is
|
|||||||
|
|
||||||
returns NSections from GeomFill;
|
returns NSections from GeomFill;
|
||||||
|
|
||||||
Create(NC : SequenceOfCurve from TColGeom;
|
Create(NC : SequenceOfCurve from TColGeom;
|
||||||
NP : SequenceOfReal from TColStd;
|
Trsfs : SequenceOfTrsf from GeomFill;
|
||||||
|
NP : SequenceOfReal from TColStd;
|
||||||
UF, UL, VF, VL : Real from Standard;
|
UF, UL, VF, VL : Real from Standard;
|
||||||
Surf : BSplineSurface from Geom)
|
Surf : BSplineSurface from Geom)
|
||||||
---Purpose: Make a SectionLaw with N Curves and N associated parameters.
|
---Purpose: Make a SectionLaw with N Curves and N associated parameters.
|
||||||
@ -264,7 +265,8 @@ is
|
|||||||
fields
|
fields
|
||||||
UFirst, ULast, VFirst, VLast : Real;
|
UFirst, ULast, VFirst, VLast : Real;
|
||||||
mySections : SequenceOfCurve from TColGeom;
|
mySections : SequenceOfCurve from TColGeom;
|
||||||
myParams : SequenceOfReal from TColStd;
|
myTrsfs : SequenceOfTrsf from GeomFill;
|
||||||
|
myParams : SequenceOfReal from TColStd;
|
||||||
mySurface : BSplineSurface from Geom;
|
mySurface : BSplineSurface from Geom;
|
||||||
myRefSurf : BSplineSurface from Geom;
|
myRefSurf : BSplineSurface from Geom;
|
||||||
end NSections;
|
end NSections;
|
||||||
|
@ -249,6 +249,7 @@ GeomFill_NSections::GeomFill_NSections(const TColGeom_SequenceOfCurve& NC,
|
|||||||
//=======================================================================
|
//=======================================================================
|
||||||
|
|
||||||
GeomFill_NSections::GeomFill_NSections(const TColGeom_SequenceOfCurve& NC,
|
GeomFill_NSections::GeomFill_NSections(const TColGeom_SequenceOfCurve& NC,
|
||||||
|
const GeomFill_SequenceOfTrsf& Trsfs,
|
||||||
const TColStd_SequenceOfReal& NP,
|
const TColStd_SequenceOfReal& NP,
|
||||||
const Standard_Real UF,
|
const Standard_Real UF,
|
||||||
const Standard_Real UL,
|
const Standard_Real UL,
|
||||||
@ -257,6 +258,7 @@ GeomFill_NSections::GeomFill_NSections(const TColGeom_SequenceOfCurve& NC,
|
|||||||
const Handle(Geom_BSplineSurface)& Surf)
|
const Handle(Geom_BSplineSurface)& Surf)
|
||||||
{
|
{
|
||||||
mySections = NC;
|
mySections = NC;
|
||||||
|
myTrsfs = Trsfs;
|
||||||
myParams = NP;
|
myParams = NP;
|
||||||
UFirst = UF;
|
UFirst = UF;
|
||||||
ULast = UL;
|
ULast = UL;
|
||||||
@ -936,29 +938,43 @@ void GeomFill_NSections::GetMinimalWeight(TColStd_Array1OfReal& Weights) const
|
|||||||
&& ( AC2.GetType() == GeomAbs_Circle ) ;
|
&& ( AC2.GetType() == GeomAbs_Circle ) ;
|
||||||
if (isconic) {
|
if (isconic) {
|
||||||
gp_Circ C1 = AC1.Circle();
|
gp_Circ C1 = AC1.Circle();
|
||||||
|
if (!myTrsfs.IsEmpty())
|
||||||
|
C1.Transform(myTrsfs(1).Inverted());
|
||||||
gp_Circ C2 = AC2.Circle();
|
gp_Circ C2 = AC2.Circle();
|
||||||
|
if (!myTrsfs.IsEmpty())
|
||||||
|
C2.Transform(myTrsfs(2).Inverted());
|
||||||
Standard_Real Tol = 1.e-7;
|
Standard_Real Tol = 1.e-7;
|
||||||
Standard_Boolean samedir, linearrad, sameaxis;
|
//Standard_Boolean samedir, linearrad, sameaxis;
|
||||||
samedir = (C1.Axis().IsParallel(C2.Axis(),1.e-4));
|
isconic = (C1.Axis().IsParallel(C2.Axis(),1.e-4));
|
||||||
// pour 2 sections, la variation du rayon est forcement lineaire
|
// pour 2 sections, la variation du rayon est forcement lineaire
|
||||||
linearrad = Standard_True;
|
//linearrad = Standard_True;
|
||||||
// formule plus generale pour 3 sections au moins
|
// formule plus generale pour 3 sections au moins
|
||||||
// Standard_Real param0 = C2.Radius()*myParams(1) - C1.Radius()*myParams(2);
|
// Standard_Real param0 = C2.Radius()*myParams(1) - C1.Radius()*myParams(2);
|
||||||
// param0 = param0 / (C2.Radius()-C1.Radius()) ;
|
// param0 = param0 / (C2.Radius()-C1.Radius()) ;
|
||||||
// linearrad = ( Abs( C3.Radius()*myParams(1)-C1.Radius()*myParams(3)
|
// linearrad = ( Abs( C3.Radius()*myParams(1)-C1.Radius()*myParams(3)
|
||||||
// - param0*(C3.Radius()-C1.Radius()) ) < Tol);
|
// - param0*(C3.Radius()-C1.Radius()) ) < Tol);
|
||||||
sameaxis = (C1.Location().Distance(C2.Location())<Tol);
|
if (isconic)
|
||||||
if (!sameaxis) {
|
{
|
||||||
|
gp_Lin Line1(C1.Axis());
|
||||||
|
isconic = (Line1.Distance(C2.Location()) < Tol);
|
||||||
|
/*
|
||||||
|
sameaxis = (C1.Location().Distance(C2.Location())<Tol);
|
||||||
|
if (!sameaxis) {
|
||||||
gp_Ax1 D(C1.Location(),gp_Vec(C1.Location(),C2.Location()));
|
gp_Ax1 D(C1.Location(),gp_Vec(C1.Location(),C2.Location()));
|
||||||
sameaxis = (C1.Axis().IsParallel(D,1.e-4));
|
sameaxis = (C1.Axis().IsParallel(D,1.e-4));
|
||||||
|
}
|
||||||
|
isconic = samedir && linearrad && sameaxis;
|
||||||
|
*/
|
||||||
|
if (isconic)
|
||||||
|
{
|
||||||
|
//// Modified by jgv, 18.02.2009 for OCC20866 ////
|
||||||
|
Standard_Real first1 = AC1.FirstParameter(), last1 = AC1.LastParameter();
|
||||||
|
Standard_Real first2 = AC2.FirstParameter(), last2 = AC2.LastParameter();
|
||||||
|
isconic = (Abs(first1-first2) <= Precision::PConfusion() &&
|
||||||
|
Abs(last1-last2) <= Precision::PConfusion());
|
||||||
|
//////////////////////////////////////////////////
|
||||||
|
}
|
||||||
}
|
}
|
||||||
isconic = samedir && linearrad && sameaxis;
|
|
||||||
//// Modified by jgv, 18.02.2009 for OCC20866 ////
|
|
||||||
Standard_Real first1 = AC1.FirstParameter(), last1 = AC1.LastParameter();
|
|
||||||
Standard_Real first2 = AC2.FirstParameter(), last2 = AC2.LastParameter();
|
|
||||||
isconic = (Abs(first1-first2) <= Precision::PConfusion() &&
|
|
||||||
Abs(last1-last2) <= Precision::PConfusion());
|
|
||||||
//////////////////////////////////////////////////
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user