1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-10 18:51:21 +03:00

0031361: Modeling algorithms - An exception arise when building tube

* Add status flag to GeomFill_Pipe
* Add myIsPerform flag to GeomFill_Pipe
* Add checking vectors in GeomFill_CorrectedFrenet
* Add boolean return to SetCurve virtual methods
* Add test case
This commit is contained in:
mgerus 2022-04-04 10:00:24 +03:00 committed by smoskvin
parent e3fd3d83da
commit b2ec2f5d42
26 changed files with 172 additions and 114 deletions

View File

@ -66,12 +66,14 @@ GeomFill_ConstantBiNormal::GeomFill_ConstantBiNormal(const gp_Dir& BiNormal) : B
return copy; return copy;
} }
void GeomFill_ConstantBiNormal::SetCurve(const Handle(Adaptor3d_Curve)& C) Standard_Boolean GeomFill_ConstantBiNormal::SetCurve(const Handle(Adaptor3d_Curve)& C)
{ {
Standard_Boolean isOK = Standard_False;
GeomFill_TrihedronLaw::SetCurve(C); GeomFill_TrihedronLaw::SetCurve(C);
if (! C.IsNull()) { if (! C.IsNull()) {
frenet->SetCurve(C); isOK = frenet->SetCurve(C);
} }
return isOK;
} }
Standard_Boolean GeomFill_ConstantBiNormal::D0(const Standard_Real Param,gp_Vec& Tangent,gp_Vec& Normal,gp_Vec& BiNormal) Standard_Boolean GeomFill_ConstantBiNormal::D0(const Standard_Real Param,gp_Vec& Tangent,gp_Vec& Normal,gp_Vec& BiNormal)

View File

@ -45,7 +45,9 @@ public:
Standard_EXPORT virtual Handle(GeomFill_TrihedronLaw) Copy() const Standard_OVERRIDE; Standard_EXPORT virtual Handle(GeomFill_TrihedronLaw) Copy() const Standard_OVERRIDE;
Standard_EXPORT virtual void SetCurve (const Handle(Adaptor3d_Curve)& C) Standard_OVERRIDE; //! initialize curve of trihedron law
//! @return Standard_True in case if execution end correctly
Standard_EXPORT virtual Standard_Boolean SetCurve (const Handle(Adaptor3d_Curve)& C) Standard_OVERRIDE;
//! Computes Triedrhon on curve at parameter <Param> //! Computes Triedrhon on curve at parameter <Param>
Standard_EXPORT virtual Standard_Boolean D0 (const Standard_Real Param, gp_Vec& Tangent, gp_Vec& Normal, gp_Vec& BiNormal) Standard_OVERRIDE; Standard_EXPORT virtual Standard_Boolean D0 (const Standard_Real Param, gp_Vec& Tangent, gp_Vec& Normal, gp_Vec& BiNormal) Standard_OVERRIDE;

View File

@ -337,34 +337,36 @@ Handle(GeomFill_TrihedronLaw) GeomFill_CorrectedFrenet::Copy() const
return copy; return copy;
} }
void GeomFill_CorrectedFrenet::SetCurve(const Handle(Adaptor3d_Curve)& C) Standard_Boolean GeomFill_CorrectedFrenet::SetCurve(const Handle(Adaptor3d_Curve)& C)
{ {
GeomFill_TrihedronLaw::SetCurve(C); GeomFill_TrihedronLaw::SetCurve(C);
if (! C.IsNull()) { if (! C.IsNull())
{
frenet->SetCurve(C); frenet->SetCurve(C);
GeomAbs_CurveType type; GeomAbs_CurveType type;
type = C->GetType(); type = C->GetType();
switch (type) { switch (type)
{
case GeomAbs_Circle: case GeomAbs_Circle:
case GeomAbs_Ellipse: case GeomAbs_Ellipse:
case GeomAbs_Hyperbola: case GeomAbs_Hyperbola:
case GeomAbs_Parabola: case GeomAbs_Parabola:
case GeomAbs_Line: case GeomAbs_Line:
{ {
// No probleme isFrenet // No probleme isFrenet
isFrenet = Standard_True; isFrenet = Standard_True;
break; break;
} }
default : default :
{ {
// We have to search singularities // We have to search singularities
isFrenet = Standard_True; isFrenet = Standard_True;
Init(); Init();
} }
} }
} }
return isFrenet;
} }
@ -438,16 +440,20 @@ Handle(GeomFill_TrihedronLaw) GeomFill_CorrectedFrenet::Copy() const
TLaw = EvolAroundT; TLaw = EvolAroundT;
//OCC78 //OCC78
Standard_Integer iEnd = SeqPoles.Length(); Standard_Integer iEnd = SeqPoles.Length();
HArrPoles = new TColStd_HArray1OfReal(1, iEnd); if (iEnd != 0)
HArrAngle = new TColStd_HArray1OfReal(1, iEnd); {
HArrTangent = new TColgp_HArray1OfVec(1, iEnd); HArrPoles = new TColStd_HArray1OfReal(1, iEnd);
HArrNormal = new TColgp_HArray1OfVec(1, iEnd); HArrAngle = new TColStd_HArray1OfReal(1, iEnd);
for(i = 1; i <= iEnd; i++){ HArrTangent = new TColgp_HArray1OfVec(1, iEnd);
HArrPoles->ChangeValue(i) = SeqPoles(i); HArrNormal = new TColgp_HArray1OfVec(1, iEnd);
HArrAngle->ChangeValue(i) = SeqAngle(i); for (i = 1; i <= iEnd; i++) {
HArrTangent->ChangeValue(i) = SeqTangent(i); HArrPoles->ChangeValue(i) = SeqPoles(i);
HArrNormal->ChangeValue(i) = SeqNormal(i); HArrAngle->ChangeValue(i) = SeqAngle(i);
}; HArrTangent->ChangeValue(i) = SeqTangent(i);
HArrNormal->ChangeValue(i) = SeqNormal(i);
};
}
#ifdef DRAW #ifdef DRAW
if (Affich) { if (Affich) {
@ -612,7 +618,7 @@ Standard_Real GeomFill_CorrectedFrenet::CalcAngleAT(const gp_Vec& Tangent, const
Standard_Real angle; Standard_Real angle;
gp_Vec Normal_rot, cross; gp_Vec Normal_rot, cross;
angle = Tangent.Angle(prevTangent); angle = Tangent.Angle(prevTangent);
if (Abs(angle) > Precision::Angular()) { if (Abs(angle) > Precision::Angular() && Abs(angle) < M_PI - Precision::Angular()) {
cross = Tangent.Crossed(prevTangent).Normalized(); cross = Tangent.Crossed(prevTangent).Normalized();
Normal_rot = Normal + sin(angle)*cross.Crossed(Normal) + Normal_rot = Normal + sin(angle)*cross.Crossed(Normal) +
(1 - cos(angle))*cross.Crossed(cross.Crossed(Normal)); (1 - cos(angle))*cross.Crossed(cross.Crossed(Normal));

View File

@ -52,7 +52,9 @@ public:
Standard_EXPORT virtual Handle(GeomFill_TrihedronLaw) Copy() const Standard_OVERRIDE; Standard_EXPORT virtual Handle(GeomFill_TrihedronLaw) Copy() const Standard_OVERRIDE;
Standard_EXPORT virtual void SetCurve (const Handle(Adaptor3d_Curve)& C) Standard_OVERRIDE; //! initialize curve of frenet law
//! @return Standard_True in case if execution end correctly
Standard_EXPORT virtual Standard_Boolean SetCurve (const Handle(Adaptor3d_Curve)& C) Standard_OVERRIDE;
Standard_EXPORT virtual void SetInterval (const Standard_Real First, const Standard_Real Last) Standard_OVERRIDE; Standard_EXPORT virtual void SetInterval (const Standard_Real First, const Standard_Real Last) Standard_OVERRIDE;

View File

@ -63,11 +63,11 @@ Handle(GeomFill_LocationLaw) GeomFill_CurveAndTrihedron::Copy() const
//Function: SetCurve //Function: SetCurve
//Purpose : //Purpose :
//================================================================== //==================================================================
void GeomFill_CurveAndTrihedron::SetCurve(const Handle(Adaptor3d_Curve)& C) Standard_Boolean GeomFill_CurveAndTrihedron::SetCurve(const Handle(Adaptor3d_Curve)& C)
{ {
myCurve = C; myCurve = C;
myTrimmed = C; myTrimmed = C;
myLaw->SetCurve(C); return myLaw->SetCurve(C);
} }
const Handle(Adaptor3d_Curve)& GeomFill_CurveAndTrihedron::GetCurve() const const Handle(Adaptor3d_Curve)& GeomFill_CurveAndTrihedron::GetCurve() const

View File

@ -52,7 +52,9 @@ public:
Standard_EXPORT GeomFill_CurveAndTrihedron(const Handle(GeomFill_TrihedronLaw)& Trihedron); Standard_EXPORT GeomFill_CurveAndTrihedron(const Handle(GeomFill_TrihedronLaw)& Trihedron);
Standard_EXPORT virtual void SetCurve (const Handle(Adaptor3d_Curve)& C) Standard_OVERRIDE; //! initialize curve of trihedron law
//! @return Standard_True in case if execution end correctly
Standard_EXPORT virtual Standard_Boolean SetCurve (const Handle(Adaptor3d_Curve)& C) Standard_OVERRIDE;
Standard_EXPORT virtual const Handle(Adaptor3d_Curve)& GetCurve() const Standard_OVERRIDE; Standard_EXPORT virtual const Handle(Adaptor3d_Curve)& GetCurve() const Standard_OVERRIDE;

View File

@ -61,33 +61,36 @@ Handle(GeomFill_TrihedronLaw) GeomFill_DiscreteTrihedron::Copy() const
//purpose : //purpose :
//======================================================================= //=======================================================================
void GeomFill_DiscreteTrihedron::SetCurve(const Handle(Adaptor3d_Curve)& C) Standard_Boolean GeomFill_DiscreteTrihedron::SetCurve(const Handle(Adaptor3d_Curve)& C)
{ {
GeomFill_TrihedronLaw::SetCurve(C); GeomFill_TrihedronLaw::SetCurve(C);
if (! C.IsNull()) { if (! C.IsNull())
{
GeomAbs_CurveType type; GeomAbs_CurveType type;
type = C->GetType(); type = C->GetType();
switch (type) { switch (type)
{
case GeomAbs_Circle: case GeomAbs_Circle:
case GeomAbs_Ellipse: case GeomAbs_Ellipse:
case GeomAbs_Hyperbola: case GeomAbs_Hyperbola:
case GeomAbs_Parabola: case GeomAbs_Parabola:
case GeomAbs_Line: case GeomAbs_Line:
{ {
// No problem // No problem
myUseFrenet = Standard_True; myUseFrenet = Standard_True;
myFrenet->SetCurve(C); myFrenet->SetCurve(C);
break; break;
} }
default : default :
{ {
myUseFrenet = Standard_False; myUseFrenet = Standard_False;
// We have to fill <myKnots> and <myTrihedrons> // We have to fill <myKnots> and <myTrihedrons>
Init(); Init();
break; break;
} }
} }
} }
return myUseFrenet;
} }
//======================================================================= //=======================================================================

View File

@ -51,7 +51,9 @@ public:
Standard_EXPORT void Init(); Standard_EXPORT void Init();
Standard_EXPORT virtual void SetCurve (const Handle(Adaptor3d_Curve)& C) Standard_OVERRIDE; //! initialize curve of trihedron law
//! @return Standard_True in case if execution end correctly
Standard_EXPORT virtual Standard_Boolean SetCurve (const Handle(Adaptor3d_Curve)& C) Standard_OVERRIDE;
//! compute Trihedron on curve at parameter <Param> //! compute Trihedron on curve at parameter <Param>
Standard_EXPORT virtual Standard_Boolean D0 (const Standard_Real Param, gp_Vec& Tangent, gp_Vec& Normal, gp_Vec& BiNormal) Standard_OVERRIDE; Standard_EXPORT virtual Standard_Boolean D0 (const Standard_Real Param, gp_Vec& Tangent, gp_Vec& Normal, gp_Vec& BiNormal) Standard_OVERRIDE;

View File

@ -117,7 +117,7 @@ Handle(GeomFill_TrihedronLaw) GeomFill_Frenet::Copy() const
//purpose : //purpose :
//======================================================================= //=======================================================================
void GeomFill_Frenet::SetCurve(const Handle(Adaptor3d_Curve)& C) Standard_Boolean GeomFill_Frenet::SetCurve(const Handle(Adaptor3d_Curve)& C)
{ {
GeomFill_TrihedronLaw::SetCurve(C); GeomFill_TrihedronLaw::SetCurve(C);
if (! C.IsNull()) { if (! C.IsNull()) {
@ -141,6 +141,7 @@ Handle(GeomFill_TrihedronLaw) GeomFill_Frenet::Copy() const
} }
} }
} }
return Standard_True;
} }
//======================================================================= //=======================================================================

View File

@ -47,7 +47,9 @@ public:
Standard_EXPORT void Init(); Standard_EXPORT void Init();
Standard_EXPORT virtual void SetCurve (const Handle(Adaptor3d_Curve)& C) Standard_OVERRIDE; //! initialize curve of frenet law
//! @return Standard_True
Standard_EXPORT virtual Standard_Boolean SetCurve (const Handle(Adaptor3d_Curve)& C) Standard_OVERRIDE;
//! compute Triedrhon on curve at parameter <Param> //! compute Triedrhon on curve at parameter <Param>
Standard_EXPORT virtual Standard_Boolean D0 (const Standard_Real Param, gp_Vec& Tangent, gp_Vec& Normal, gp_Vec& BiNormal) Standard_OVERRIDE; Standard_EXPORT virtual Standard_Boolean D0 (const Standard_Real Param, gp_Vec& Tangent, gp_Vec& Normal, gp_Vec& BiNormal) Standard_OVERRIDE;

View File

@ -292,7 +292,7 @@ GeomFill_GuideTrihedronAC::GeomFill_GuideTrihedronAC(const Handle(Adaptor3d_Curv
//function : SetCurve //function : SetCurve
//purpose : //purpose :
//======================================================================= //=======================================================================
void GeomFill_GuideTrihedronAC::SetCurve(const Handle(Adaptor3d_Curve)& C) Standard_Boolean GeomFill_GuideTrihedronAC::SetCurve(const Handle(Adaptor3d_Curve)& C)
{ {
myCurve = C; myCurve = C;
myTrimmed = C; myTrimmed = C;
@ -301,6 +301,7 @@ GeomFill_GuideTrihedronAC::GeomFill_GuideTrihedronAC(const Handle(Adaptor3d_Curv
L = myCurveAC->GetLength(); L = myCurveAC->GetLength();
// CorrectOrient(myGuide); // CorrectOrient(myGuide);
} }
return Standard_True;
} }

View File

@ -44,7 +44,9 @@ public:
Standard_EXPORT GeomFill_GuideTrihedronAC(const Handle(Adaptor3d_Curve)& guide); Standard_EXPORT GeomFill_GuideTrihedronAC(const Handle(Adaptor3d_Curve)& guide);
Standard_EXPORT virtual void SetCurve (const Handle(Adaptor3d_Curve)& C) Standard_OVERRIDE; //! initialize curve of trihedron law
//! @return Standard_True
Standard_EXPORT virtual Standard_Boolean SetCurve (const Handle(Adaptor3d_Curve)& C) Standard_OVERRIDE;
Standard_EXPORT virtual Handle(GeomFill_TrihedronLaw) Copy() const Standard_OVERRIDE; Standard_EXPORT virtual Handle(GeomFill_TrihedronLaw) Copy() const Standard_OVERRIDE;

View File

@ -197,10 +197,11 @@ GeomFill_GuideTrihedronPlan::GeomFill_GuideTrihedronPlan (const Handle(Adaptor3d
//function : SetCurve //function : SetCurve
//purpose : calculation of trihedron //purpose : calculation of trihedron
//======================================================================= //=======================================================================
void GeomFill_GuideTrihedronPlan::SetCurve(const Handle(Adaptor3d_Curve)& C) Standard_Boolean GeomFill_GuideTrihedronPlan::SetCurve(const Handle(Adaptor3d_Curve)& C)
{ {
myCurve = C; myCurve = C;
if (!myCurve.IsNull()) Init(); if (!myCurve.IsNull()) Init();
return Standard_True;
} }
//======================================================================= //=======================================================================

View File

@ -48,7 +48,9 @@ public:
Standard_EXPORT GeomFill_GuideTrihedronPlan(const Handle(Adaptor3d_Curve)& theGuide); Standard_EXPORT GeomFill_GuideTrihedronPlan(const Handle(Adaptor3d_Curve)& theGuide);
Standard_EXPORT virtual void SetCurve (const Handle(Adaptor3d_Curve)& thePath) Standard_OVERRIDE; //! initialize curve of trihedron law
//! @return Standard_True in case if execution end correctly
Standard_EXPORT virtual Standard_Boolean SetCurve (const Handle(Adaptor3d_Curve)& thePath) Standard_OVERRIDE;
Standard_EXPORT virtual Handle(GeomFill_TrihedronLaw) Copy() const Standard_OVERRIDE; Standard_EXPORT virtual Handle(GeomFill_TrihedronLaw) Copy() const Standard_OVERRIDE;

View File

@ -105,13 +105,14 @@ GeomFill_LocationDraft::GeomFill_LocationDraft
//Purpose : Calcul des poles sur la surfaces d'arret (intersection //Purpose : Calcul des poles sur la surfaces d'arret (intersection
// entre la generatrice et la surface en myNbPts points de la section) // entre la generatrice et la surface en myNbPts points de la section)
//================================================================== //==================================================================
void GeomFill_LocationDraft::SetCurve(const Handle(Adaptor3d_Curve)& C) Standard_Boolean GeomFill_LocationDraft::SetCurve(const Handle(Adaptor3d_Curve)& C)
{ {
myCurve = C; myCurve = C;
myTrimmed = C; myTrimmed = C;
myLaw->SetCurve(C); Standard_Boolean isOK = myLaw->SetCurve(C);
Prepare(); Prepare();
return isOK;
} }
//================================================================== //==================================================================

View File

@ -46,7 +46,9 @@ public:
Standard_EXPORT void SetAngle (const Standard_Real Angle); Standard_EXPORT void SetAngle (const Standard_Real Angle);
Standard_EXPORT virtual void SetCurve (const Handle(Adaptor3d_Curve)& C) Standard_OVERRIDE; //! calculation of poles on locking surfaces (the intersection between the generatrixand the surface at the cross - section points myNbPts)
//! @return Standard_True in case if execution end correctly
Standard_EXPORT virtual Standard_Boolean SetCurve (const Handle(Adaptor3d_Curve)& C) Standard_OVERRIDE;
Standard_EXPORT virtual const Handle(Adaptor3d_Curve)& GetCurve() const Standard_OVERRIDE; Standard_EXPORT virtual const Handle(Adaptor3d_Curve)& GetCurve() const Standard_OVERRIDE;

View File

@ -537,7 +537,7 @@ static void InGoodPeriod(const Standard_Real Prec,
//Purpose : Calcul des poles sur la surface d'arret (intersection //Purpose : Calcul des poles sur la surface d'arret (intersection
// courbe guide / surface de revolution en myNbPts points) // courbe guide / surface de revolution en myNbPts points)
//================================================================== //==================================================================
void GeomFill_LocationGuide::SetCurve(const Handle(Adaptor3d_Curve)& C) Standard_Boolean GeomFill_LocationGuide::SetCurve(const Handle(Adaptor3d_Curve)& C)
{ {
Standard_Real LastAngle; Standard_Real LastAngle;
myCurve = C; myCurve = C;
@ -550,6 +550,7 @@ static void InGoodPeriod(const Standard_Real Prec,
if (rotation) SetRotation(myPoles2d->Value(1,1).X(), LastAngle); if (rotation) SetRotation(myPoles2d->Value(1,1).X(), LastAngle);
} }
return myStatus == GeomFill_PipeOk;
} }
//================================================================== //==================================================================

View File

@ -56,7 +56,9 @@ public:
Standard_EXPORT void EraseRotation(); Standard_EXPORT void EraseRotation();
Standard_EXPORT virtual void SetCurve (const Handle(Adaptor3d_Curve)& C) Standard_OVERRIDE; //! calculating poles on a surface (courbe guide / the surface of rotation in points myNbPts)
//! @return Standard_True
Standard_EXPORT virtual Standard_Boolean SetCurve (const Handle(Adaptor3d_Curve)& C) Standard_OVERRIDE;
Standard_EXPORT virtual const Handle(Adaptor3d_Curve)& GetCurve() const Standard_OVERRIDE; Standard_EXPORT virtual const Handle(Adaptor3d_Curve)& GetCurve() const Standard_OVERRIDE;

View File

@ -38,9 +38,8 @@ class GeomFill_LocationLaw : public Standard_Transient
{ {
public: public:
//! initialize curve of location law
Standard_EXPORT virtual Standard_Boolean SetCurve (const Handle(Adaptor3d_Curve)& C) = 0;
Standard_EXPORT virtual void SetCurve (const Handle(Adaptor3d_Curve)& C) = 0;
Standard_EXPORT virtual const Handle(Adaptor3d_Curve)& GetCurve() const = 0; Standard_EXPORT virtual const Handle(Adaptor3d_Curve)& GetCurve() const = 0;

View File

@ -205,7 +205,7 @@ static Standard_Boolean CheckSense(const TColGeom_SequenceOfCurve& Seq1,
//purpose : constructor with no parameters. //purpose : constructor with no parameters.
//======================================================================= //=======================================================================
GeomFill_Pipe::GeomFill_Pipe() : myIsDone(Standard_False),myExchUV(Standard_False),myKPart(Standard_False) GeomFill_Pipe::GeomFill_Pipe() : myStatus(GeomFill_PipeNotOk), myExchUV(Standard_False),myKPart(Standard_False)
{ {
Init(); Init();
} }
@ -218,7 +218,7 @@ GeomFill_Pipe::GeomFill_Pipe() : myIsDone(Standard_False),myExchUV(Standard_Fals
GeomFill_Pipe::GeomFill_Pipe(const Handle(Geom_Curve)& Path, GeomFill_Pipe::GeomFill_Pipe(const Handle(Geom_Curve)& Path,
const Standard_Real Radius) const Standard_Real Radius)
: myIsDone(Standard_False),myExchUV(Standard_False),myKPart(Standard_False) : myStatus(GeomFill_PipeNotOk), myExchUV(Standard_False),myKPart(Standard_False)
{ {
Init(); Init();
Init(Path, Radius); Init(Path, Radius);
@ -232,7 +232,7 @@ GeomFill_Pipe::GeomFill_Pipe(const Handle(Geom_Curve)& Path,
GeomFill_Pipe::GeomFill_Pipe(const Handle(Geom_Curve)& Path, GeomFill_Pipe::GeomFill_Pipe(const Handle(Geom_Curve)& Path,
const Handle(Geom_Curve)& FirstSect, const Handle(Geom_Curve)& FirstSect,
const GeomFill_Trihedron Option) const GeomFill_Trihedron Option)
: myIsDone(Standard_False),myExchUV(Standard_False),myKPart(Standard_False) : myStatus(GeomFill_PipeNotOk), myExchUV(Standard_False),myKPart(Standard_False)
{ {
Init(); Init();
Init(Path, FirstSect, Option); Init(Path, FirstSect, Option);
@ -246,7 +246,7 @@ GeomFill_Pipe::GeomFill_Pipe(const Handle(Geom_Curve)& Path,
GeomFill_Pipe::GeomFill_Pipe(const Handle(Geom2d_Curve)& Path, GeomFill_Pipe::GeomFill_Pipe(const Handle(Geom2d_Curve)& Path,
const Handle(Geom_Surface)& Support, const Handle(Geom_Surface)& Support,
const Handle(Geom_Curve)& FirstSect) const Handle(Geom_Curve)& FirstSect)
: myIsDone(Standard_False),myExchUV(Standard_False),myKPart(Standard_False) : myStatus(GeomFill_PipeNotOk), myExchUV(Standard_False),myKPart(Standard_False)
{ {
Init(); Init();
Init(Path, Support, FirstSect); Init(Path, Support, FirstSect);
@ -260,7 +260,7 @@ GeomFill_Pipe::GeomFill_Pipe(const Handle(Geom2d_Curve)& Path,
GeomFill_Pipe::GeomFill_Pipe(const Handle(Geom_Curve)& Path, GeomFill_Pipe::GeomFill_Pipe(const Handle(Geom_Curve)& Path,
const Handle(Geom_Curve)& FirstSect, const Handle(Geom_Curve)& FirstSect,
const Handle(Geom_Curve)& LastSect) const Handle(Geom_Curve)& LastSect)
: myIsDone(Standard_False),myExchUV(Standard_False),myKPart(Standard_False) : myStatus(GeomFill_PipeNotOk), myExchUV(Standard_False),myKPart(Standard_False)
{ {
Init(); Init();
Init(Path, FirstSect, LastSect); Init(Path, FirstSect, LastSect);
@ -274,7 +274,7 @@ GeomFill_Pipe::GeomFill_Pipe(const Handle(Geom_Curve)& Path,
GeomFill_Pipe::GeomFill_Pipe(const Handle(Geom_Curve)& Path, GeomFill_Pipe::GeomFill_Pipe(const Handle(Geom_Curve)& Path,
const TColGeom_SequenceOfCurve& NSections) const TColGeom_SequenceOfCurve& NSections)
: myIsDone(Standard_False),myExchUV(Standard_False),myKPart(Standard_False) : myStatus(GeomFill_PipeNotOk), myExchUV(Standard_False),myKPart(Standard_False)
{ {
Init(); Init();
Init(Path, NSections); Init(Path, NSections);
@ -288,7 +288,7 @@ GeomFill_Pipe::GeomFill_Pipe(const Handle(Geom_Curve)& Path,
GeomFill_Pipe::GeomFill_Pipe(const Handle(Geom_Curve)& Path, GeomFill_Pipe::GeomFill_Pipe(const Handle(Geom_Curve)& Path,
const Handle(Geom_Curve)& Curve1, const Handle(Geom_Curve)& Curve1,
const gp_Dir& Direction) const gp_Dir& Direction)
: myIsDone(Standard_False),myExchUV(Standard_False), myKPart(Standard_False) : myStatus(GeomFill_PipeNotOk), myExchUV(Standard_False), myKPart(Standard_False)
{ {
Init(Path, Curve1, Direction); Init(Path, Curve1, Direction);
} }
@ -301,7 +301,7 @@ GeomFill_Pipe::GeomFill_Pipe(const Handle(Geom_Curve)& Path,
const Handle(Geom_Curve)& Curve1, const Handle(Geom_Curve)& Curve1,
const Handle(Geom_Curve)& Curve2, const Handle(Geom_Curve)& Curve2,
const Standard_Real Radius) const Standard_Real Radius)
: myIsDone(Standard_False),myExchUV(Standard_False),myKPart(Standard_False) : myStatus(GeomFill_PipeNotOk), myExchUV(Standard_False),myKPart(Standard_False)
{ {
Init(); Init();
Handle(GeomAdaptor_Curve) AdpPath = Handle(GeomAdaptor_Curve) AdpPath =
@ -324,7 +324,7 @@ GeomFill_Pipe::GeomFill_Pipe(const Handle(Adaptor3d_Curve)& Path,
const Handle(Adaptor3d_Curve)& Curve1, const Handle(Adaptor3d_Curve)& Curve1,
const Handle(Adaptor3d_Curve)& Curve2, const Handle(Adaptor3d_Curve)& Curve2,
const Standard_Real Radius) const Standard_Real Radius)
: myIsDone(Standard_False),myExchUV(Standard_False),myKPart(Standard_False) : myStatus(GeomFill_PipeNotOk), myExchUV(Standard_False),myKPart(Standard_False)
{ {
Init(); Init();
Init(Path,Curve1,Curve2,Radius); Init(Path,Curve1,Curve2,Radius);
@ -344,7 +344,7 @@ GeomFill_Pipe::GeomFill_Pipe(const Handle(Geom_Curve)& Path,
const Handle(Geom_Curve)& FirstSect, const Handle(Geom_Curve)& FirstSect,
const Standard_Boolean byACR, const Standard_Boolean byACR,
const Standard_Boolean rotat) const Standard_Boolean rotat)
: myIsDone(Standard_False),myExchUV(Standard_False),myKPart(Standard_False) : myStatus(GeomFill_PipeNotOk), myExchUV(Standard_False),myKPart(Standard_False)
// Path : trajectoire // Path : trajectoire
// Guide : courbe guide // Guide : courbe guide
// FirstSect : section // FirstSect : section
@ -751,31 +751,37 @@ void GeomFill_Pipe::Init(const Handle(Geom_Curve)& Path,
if (!TLaw.IsNull()) { if (!TLaw.IsNull()) {
myLoc = new (GeomFill_CurveAndTrihedron) (TLaw); myLoc = new (GeomFill_CurveAndTrihedron) (TLaw);
myLoc->SetCurve(myAdpPath);
TColGeom_SequenceOfCurve SeqC;
TColStd_SequenceOfReal SeqP;
SeqC.Clear();
SeqP.Clear();
// sequence des sections
GeomFill_SectionPlacement Pl1(myLoc, FirstSect);
Pl1.Perform(first,Precision::Confusion());
SeqC.Append(Pl1.Section(Standard_False));
GeomFill_SectionPlacement Pl2(myLoc, LastSect);
Pl2.Perform(first,Precision::Confusion());
SeqC.Append(Pl2.Section(Standard_False));
// sequence des parametres associes
SeqP.Append(first);
SeqP.Append(last);
// verification de l'orientation if (!(myLoc->SetCurve(myAdpPath)))
TColGeom_SequenceOfCurve NewSeq; {
if (CheckSense(SeqC,NewSeq)) SeqC = NewSeq; myStatus = GeomFill_ImpossibleContact;
return;
}
// creation de la NSections TColGeom_SequenceOfCurve SeqC;
Standard_Real deb,fin; TColStd_SequenceOfReal SeqP;
deb = SeqC.First()->FirstParameter(); SeqC.Clear();
fin = SeqC.First()->LastParameter(); SeqP.Clear();
mySec = new (GeomFill_NSections) (SeqC,SeqP,deb,fin,first,last); // sequence of sections
GeomFill_SectionPlacement Pl1(myLoc, FirstSect);
Pl1.Perform(first, Precision::Confusion());
SeqC.Append(Pl1.Section(Standard_False));
GeomFill_SectionPlacement Pl2(myLoc, LastSect);
Pl2.Perform(first, Precision::Confusion());
SeqC.Append(Pl2.Section(Standard_False));
// sequence of associated parameters
SeqP.Append(first);
SeqP.Append(last);
// orientation verification
TColGeom_SequenceOfCurve NewSeq;
if (CheckSense(SeqC, NewSeq)) SeqC = NewSeq;
// creation of the NSections
Standard_Real deb, fin;
deb = SeqC.First()->FirstParameter();
fin = SeqC.First()->LastParameter();
mySec = new (GeomFill_NSections) (SeqC, SeqP, deb, fin, first, last);
} }
} }
@ -831,6 +837,11 @@ void GeomFill_Pipe::Perform(const Standard_Real Tol,
const Standard_Integer DegMax, const Standard_Integer DegMax,
const Standard_Integer NbMaxSegment) const Standard_Integer NbMaxSegment)
{ {
if (myStatus == GeomFill_ImpossibleContact)
{
return;
}
GeomAbs_Shape TheConti; GeomAbs_Shape TheConti;
switch (Conti) { switch (Conti) {
case GeomAbs_C0: case GeomAbs_C0:
@ -884,7 +895,7 @@ void GeomFill_Pipe::Perform(const Standard_Real Tol,
App.UDegree(), App.UDegree(),
App.VDegree()); App.VDegree());
myError = App.MaxErrorOnSurf(); myError = App.MaxErrorOnSurf();
myIsDone = Standard_True; myStatus = GeomFill_PipeOk;
} }
//else { //else {
// throw Standard_ConstructionError("GeomFill_Pipe::Perform : Cannot make a surface"); // throw Standard_ConstructionError("GeomFill_Pipe::Perform : Cannot make a surface");
@ -898,7 +909,7 @@ void GeomFill_Pipe::Perform(const Standard_Real Tol,
if (Sweep.IsDone()) { if (Sweep.IsDone()) {
mySurface = Sweep.Surface(); mySurface = Sweep.Surface();
myError = Sweep.ErrorOnSurface(); myError = Sweep.ErrorOnSurface();
myIsDone = Standard_True; myStatus = GeomFill_PipeOk;
} }
//else { //else {
// throw Standard_ConstructionError("GeomFill_Pipe::Perform : Cannot make a surface"); // throw Standard_ConstructionError("GeomFill_Pipe::Perform : Cannot make a surface");
@ -975,7 +986,7 @@ Standard_Boolean GeomFill_Pipe::KPartT4()
myAdpPath->FirstParameter(), myAdpPath->FirstParameter(),
myAdpPath->LastParameter()); myAdpPath->LastParameter());
Ok = Standard_True; //C'est bien un cylindre Ok = Standard_True; //C'est bien un cylindre
myIsDone = Standard_True; myStatus = GeomFill_PipeOk;
} }
// ----------- Cas du tore ---------------------------------- // ----------- Cas du tore ----------------------------------
else if (myAdpPath->GetType() == GeomAbs_Circle && else if (myAdpPath->GetType() == GeomAbs_Circle &&
@ -1038,7 +1049,7 @@ Standard_Boolean GeomFill_Pipe::KPartT4()
myAdpPath->FirstParameter(),myAdpPath->LastParameter(),VV1,VV2); myAdpPath->FirstParameter(),myAdpPath->LastParameter(),VV1,VV2);
myExchUV = Standard_True; myExchUV = Standard_True;
Ok = Standard_True; Ok = Standard_True;
myIsDone = Standard_True; myStatus = GeomFill_PipeOk;
} }
return Ok; return Ok;
@ -1137,6 +1148,6 @@ void GeomFill_Pipe::ApproxSurf(const Standard_Boolean WithParameters) {
App.VDegree()); App.VDegree());
Standard_Real t2d; Standard_Real t2d;
App.TolReached(myError, t2d); App.TolReached(myError, t2d);
myIsDone = Standard_True; myStatus = GeomFill_PipeOk;
} }
} }

View File

@ -21,6 +21,7 @@
#include <GeomFill_Trihedron.hxx> #include <GeomFill_Trihedron.hxx>
#include <GeomAbs_Shape.hxx> #include <GeomAbs_Shape.hxx>
#include <TColGeom_SequenceOfCurve.hxx> #include <TColGeom_SequenceOfCurve.hxx>
#include <GeomFill_PipeError.hxx>
class Geom_Surface; class Geom_Surface;
class GeomFill_LocationLaw; class GeomFill_LocationLaw;
@ -249,7 +250,11 @@ public:
//! Returns whether approximation was done. //! Returns whether approximation was done.
Standard_Boolean IsDone() const; Standard_Boolean IsDone() const;
//! Returns execution status
GeomFill_PipeError GetStatus() const
{
return myStatus;
}
protected: protected:
@ -271,8 +276,7 @@ private:
Standard_EXPORT Standard_Boolean KPartT4(); Standard_EXPORT Standard_Boolean KPartT4();
GeomFill_PipeError myStatus;//!< Execution status
Standard_Boolean myIsDone;
Standard_Real myRadius; Standard_Real myRadius;
Standard_Real myError; Standard_Real myError;
Handle(Adaptor3d_Curve) myAdpPath; Handle(Adaptor3d_Curve) myAdpPath;
@ -285,8 +289,6 @@ private:
Standard_Boolean myExchUV; Standard_Boolean myExchUV;
Standard_Boolean myKPart; Standard_Boolean myKPart;
Standard_Boolean myPolynomial; Standard_Boolean myPolynomial;
}; };

View File

@ -70,6 +70,5 @@ inline Standard_Real GeomFill_Pipe::ErrorOnSurf() const
//======================================================================= //=======================================================================
inline Standard_Boolean GeomFill_Pipe::IsDone() const inline Standard_Boolean GeomFill_Pipe::IsDone() const
{ {
return myIsDone; return myStatus == GeomFill_PipeOk;
} }

View File

@ -24,10 +24,11 @@
IMPLEMENT_STANDARD_RTTIEXT(GeomFill_TrihedronLaw,Standard_Transient) IMPLEMENT_STANDARD_RTTIEXT(GeomFill_TrihedronLaw,Standard_Transient)
void GeomFill_TrihedronLaw::SetCurve(const Handle(Adaptor3d_Curve)& C) Standard_Boolean GeomFill_TrihedronLaw::SetCurve(const Handle(Adaptor3d_Curve)& C)
{ {
myCurve = C; myCurve = C;
myTrimmed = myCurve; myTrimmed = myCurve;
return Standard_True;
} }
//================================================================== //==================================================================

View File

@ -34,8 +34,9 @@ class GeomFill_TrihedronLaw : public Standard_Transient
public: public:
//! initialize curve of trihedron law
Standard_EXPORT virtual void SetCurve (const Handle(Adaptor3d_Curve)& C); //! @return Standard_True
Standard_EXPORT virtual Standard_Boolean SetCurve (const Handle(Adaptor3d_Curve)& C);
Standard_EXPORT virtual Handle(GeomFill_TrihedronLaw) Copy() const = 0; Standard_EXPORT virtual Handle(GeomFill_TrihedronLaw) Copy() const = 0;

View File

@ -237,8 +237,8 @@ static Standard_Integer tuyau (Draw_Interpretor& di,
Pipe.Perform(1.e-4, Standard_False, Cont); Pipe.Perform(1.e-4, Standard_False, Cont);
if (!Pipe.IsDone()) { if (!Pipe.IsDone()) {
di << "GeomFill_Pipe cannot make a surface\n"; di << "Error: GeomFill_Pipe cannot make a surface\n";
return 1; return 0;
} }
Standard_Real Accuracy = Pipe.ErrorOnSurf(); Standard_Real Accuracy = Pipe.ErrorOnSurf();

View File

@ -0,0 +1,11 @@
puts "================================================="
puts "0031361: Modeling algorithms - A crash arise when building tube"
puts "================================================="
puts ""
puts "REQUIRED ALL: Error: GeomFill_Pipe cannot make a surface"
circle c1 0 0 0 10
circle c2 0 100 0 10
beziercurve curve 4 0 0 0 100 0 0 100 100 0 0 100 0
tuyau t curve c1 c2