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);
- if (! C.IsNull()) {
- frenet->SetCurve(C);
+ if (! C.IsNull()) {
+ 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_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>
Standard_EXPORT virtual Standard_Boolean D0 (const Standard_Real Param, gp_Vec& Tangent, gp_Vec& Normal, gp_Vec& BiNormal) Standard_OVERRIDE;
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);
- if (! C.IsNull()) {
+ if (! C.IsNull())
+ {
frenet->SetCurve(C);
GeomAbs_CurveType type;
type = C->GetType();
- switch (type) {
+ switch (type)
+ {
case GeomAbs_Circle:
case GeomAbs_Ellipse:
case GeomAbs_Hyperbola:
case GeomAbs_Parabola:
case GeomAbs_Line:
- {
- // No probleme isFrenet
- isFrenet = Standard_True;
- break;
- }
- default :
- {
- // We have to search singularities
- isFrenet = Standard_True;
- Init();
- }
+ {
+ // No probleme isFrenet
+ isFrenet = Standard_True;
+ break;
+ }
+ default :
+ {
+ // We have to search singularities
+ isFrenet = Standard_True;
+ Init();
+ }
}
}
+ return isFrenet;
}
TLaw = EvolAroundT;
//OCC78
Standard_Integer iEnd = SeqPoles.Length();
- HArrPoles = new TColStd_HArray1OfReal(1, iEnd);
- HArrAngle = new TColStd_HArray1OfReal(1, iEnd);
- HArrTangent = new TColgp_HArray1OfVec(1, iEnd);
- HArrNormal = new TColgp_HArray1OfVec(1, iEnd);
- for(i = 1; i <= iEnd; i++){
- HArrPoles->ChangeValue(i) = SeqPoles(i);
- HArrAngle->ChangeValue(i) = SeqAngle(i);
- HArrTangent->ChangeValue(i) = SeqTangent(i);
- HArrNormal->ChangeValue(i) = SeqNormal(i);
- };
+ if (iEnd != 0)
+ {
+ HArrPoles = new TColStd_HArray1OfReal(1, iEnd);
+ HArrAngle = new TColStd_HArray1OfReal(1, iEnd);
+ HArrTangent = new TColgp_HArray1OfVec(1, iEnd);
+ HArrNormal = new TColgp_HArray1OfVec(1, iEnd);
+ for (i = 1; i <= iEnd; i++) {
+ HArrPoles->ChangeValue(i) = SeqPoles(i);
+ HArrAngle->ChangeValue(i) = SeqAngle(i);
+ HArrTangent->ChangeValue(i) = SeqTangent(i);
+ HArrNormal->ChangeValue(i) = SeqNormal(i);
+ };
+ }
+
#ifdef DRAW
if (Affich) {
Standard_Real angle;
gp_Vec Normal_rot, cross;
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();
Normal_rot = Normal + sin(angle)*cross.Crossed(Normal) +
(1 - cos(angle))*cross.Crossed(cross.Crossed(Normal));
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;
//Function: SetCurve
//Purpose :
//==================================================================
- void GeomFill_CurveAndTrihedron::SetCurve(const Handle(Adaptor3d_Curve)& C)
+ Standard_Boolean GeomFill_CurveAndTrihedron::SetCurve(const Handle(Adaptor3d_Curve)& C)
{
myCurve = C;
myTrimmed = C;
- myLaw->SetCurve(C);
+ return myLaw->SetCurve(C);
}
const Handle(Adaptor3d_Curve)& GeomFill_CurveAndTrihedron::GetCurve() const
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;
//purpose :
//=======================================================================
-void GeomFill_DiscreteTrihedron::SetCurve(const Handle(Adaptor3d_Curve)& C)
+Standard_Boolean GeomFill_DiscreteTrihedron::SetCurve(const Handle(Adaptor3d_Curve)& C)
{
GeomFill_TrihedronLaw::SetCurve(C);
- if (! C.IsNull()) {
+ if (! C.IsNull())
+ {
GeomAbs_CurveType type;
type = C->GetType();
- switch (type) {
+ switch (type)
+ {
case GeomAbs_Circle:
case GeomAbs_Ellipse:
case GeomAbs_Hyperbola:
case GeomAbs_Parabola:
case GeomAbs_Line:
- {
- // No problem
- myUseFrenet = Standard_True;
- myFrenet->SetCurve(C);
- break;
- }
+ {
+ // No problem
+ myUseFrenet = Standard_True;
+ myFrenet->SetCurve(C);
+ break;
+ }
default :
- {
- myUseFrenet = Standard_False;
- // We have to fill <myKnots> and <myTrihedrons>
- Init();
- break;
- }
+ {
+ myUseFrenet = Standard_False;
+ // We have to fill <myKnots> and <myTrihedrons>
+ Init();
+ break;
+ }
}
}
+ return myUseFrenet;
}
//=======================================================================
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>
Standard_EXPORT virtual Standard_Boolean D0 (const Standard_Real Param, gp_Vec& Tangent, gp_Vec& Normal, gp_Vec& BiNormal) Standard_OVERRIDE;
//purpose :
//=======================================================================
- void GeomFill_Frenet::SetCurve(const Handle(Adaptor3d_Curve)& C)
+Standard_Boolean GeomFill_Frenet::SetCurve(const Handle(Adaptor3d_Curve)& C)
{
GeomFill_TrihedronLaw::SetCurve(C);
if (! C.IsNull()) {
}
}
}
+ return Standard_True;
}
//=======================================================================
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>
Standard_EXPORT virtual Standard_Boolean D0 (const Standard_Real Param, gp_Vec& Tangent, gp_Vec& Normal, gp_Vec& BiNormal) Standard_OVERRIDE;
//function : SetCurve
//purpose :
//=======================================================================
- void GeomFill_GuideTrihedronAC::SetCurve(const Handle(Adaptor3d_Curve)& C)
+ Standard_Boolean GeomFill_GuideTrihedronAC::SetCurve(const Handle(Adaptor3d_Curve)& C)
{
myCurve = C;
myTrimmed = C;
L = myCurveAC->GetLength();
// CorrectOrient(myGuide);
}
+ return Standard_True;
}
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;
//function : SetCurve
//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;
if (!myCurve.IsNull()) Init();
+ return Standard_True;
}
//=======================================================================
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;
//Purpose : Calcul des poles sur la surfaces d'arret (intersection
// 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;
myTrimmed = C;
- myLaw->SetCurve(C);
+ Standard_Boolean isOK = myLaw->SetCurve(C);
Prepare();
+ return isOK;
}
//==================================================================
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;
//Purpose : Calcul des poles sur la surface d'arret (intersection
// 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;
myCurve = C;
if (rotation) SetRotation(myPoles2d->Value(1,1).X(), LastAngle);
}
+ return myStatus == GeomFill_PipeOk;
}
//==================================================================
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;
{
public:
-
-
- Standard_EXPORT virtual void SetCurve (const Handle(Adaptor3d_Curve)& C) = 0;
+ //! initialize curve of location law
+ Standard_EXPORT virtual Standard_Boolean SetCurve (const Handle(Adaptor3d_Curve)& C) = 0;
Standard_EXPORT virtual const Handle(Adaptor3d_Curve)& GetCurve() const = 0;
//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();
}
GeomFill_Pipe::GeomFill_Pipe(const Handle(Geom_Curve)& Path,
const Standard_Real Radius)
- : myIsDone(Standard_False),myExchUV(Standard_False),myKPart(Standard_False)
+ : myStatus(GeomFill_PipeNotOk), myExchUV(Standard_False),myKPart(Standard_False)
{
Init();
Init(Path, Radius);
GeomFill_Pipe::GeomFill_Pipe(const Handle(Geom_Curve)& Path,
const Handle(Geom_Curve)& FirstSect,
const GeomFill_Trihedron Option)
- : myIsDone(Standard_False),myExchUV(Standard_False),myKPart(Standard_False)
+ : myStatus(GeomFill_PipeNotOk), myExchUV(Standard_False),myKPart(Standard_False)
{
Init();
Init(Path, FirstSect, Option);
GeomFill_Pipe::GeomFill_Pipe(const Handle(Geom2d_Curve)& Path,
const Handle(Geom_Surface)& Support,
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(Path, Support, FirstSect);
GeomFill_Pipe::GeomFill_Pipe(const Handle(Geom_Curve)& Path,
const Handle(Geom_Curve)& FirstSect,
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(Path, FirstSect, LastSect);
GeomFill_Pipe::GeomFill_Pipe(const Handle(Geom_Curve)& Path,
const TColGeom_SequenceOfCurve& NSections)
- : myIsDone(Standard_False),myExchUV(Standard_False),myKPart(Standard_False)
+ : myStatus(GeomFill_PipeNotOk), myExchUV(Standard_False),myKPart(Standard_False)
{
Init();
Init(Path, NSections);
GeomFill_Pipe::GeomFill_Pipe(const Handle(Geom_Curve)& Path,
const Handle(Geom_Curve)& Curve1,
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);
}
const Handle(Geom_Curve)& Curve1,
const Handle(Geom_Curve)& Curve2,
const Standard_Real Radius)
- : myIsDone(Standard_False),myExchUV(Standard_False),myKPart(Standard_False)
+ : myStatus(GeomFill_PipeNotOk), myExchUV(Standard_False),myKPart(Standard_False)
{
Init();
Handle(GeomAdaptor_Curve) AdpPath =
const Handle(Adaptor3d_Curve)& Curve1,
const Handle(Adaptor3d_Curve)& Curve2,
const Standard_Real Radius)
- : myIsDone(Standard_False),myExchUV(Standard_False),myKPart(Standard_False)
+ : myStatus(GeomFill_PipeNotOk), myExchUV(Standard_False),myKPart(Standard_False)
{
Init();
Init(Path,Curve1,Curve2,Radius);
const Handle(Geom_Curve)& FirstSect,
const Standard_Boolean byACR,
const Standard_Boolean rotat)
- : myIsDone(Standard_False),myExchUV(Standard_False),myKPart(Standard_False)
+ : myStatus(GeomFill_PipeNotOk), myExchUV(Standard_False),myKPart(Standard_False)
// Path : trajectoire
// Guide : courbe guide
// FirstSect : section
if (!TLaw.IsNull()) {
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
- TColGeom_SequenceOfCurve NewSeq;
- if (CheckSense(SeqC,NewSeq)) SeqC = NewSeq;
- // creation de la NSections
- Standard_Real deb,fin;
- deb = SeqC.First()->FirstParameter();
- fin = SeqC.First()->LastParameter();
- mySec = new (GeomFill_NSections) (SeqC,SeqP,deb,fin,first,last);
+ if (!(myLoc->SetCurve(myAdpPath)))
+ {
+ myStatus = GeomFill_ImpossibleContact;
+ return;
+ }
+
+ TColGeom_SequenceOfCurve SeqC;
+ TColStd_SequenceOfReal SeqP;
+ SeqC.Clear();
+ SeqP.Clear();
+ // 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);
}
}
const Standard_Integer DegMax,
const Standard_Integer NbMaxSegment)
{
+ if (myStatus == GeomFill_ImpossibleContact)
+ {
+ return;
+ }
+
GeomAbs_Shape TheConti;
switch (Conti) {
case GeomAbs_C0:
App.UDegree(),
App.VDegree());
myError = App.MaxErrorOnSurf();
- myIsDone = Standard_True;
+ myStatus = GeomFill_PipeOk;
}
//else {
// throw Standard_ConstructionError("GeomFill_Pipe::Perform : Cannot make a surface");
if (Sweep.IsDone()) {
mySurface = Sweep.Surface();
myError = Sweep.ErrorOnSurface();
- myIsDone = Standard_True;
+ myStatus = GeomFill_PipeOk;
}
//else {
// throw Standard_ConstructionError("GeomFill_Pipe::Perform : Cannot make a surface");
myAdpPath->FirstParameter(),
myAdpPath->LastParameter());
Ok = Standard_True; //C'est bien un cylindre
- myIsDone = Standard_True;
+ myStatus = GeomFill_PipeOk;
}
// ----------- Cas du tore ----------------------------------
else if (myAdpPath->GetType() == GeomAbs_Circle &&
myAdpPath->FirstParameter(),myAdpPath->LastParameter(),VV1,VV2);
myExchUV = Standard_True;
Ok = Standard_True;
- myIsDone = Standard_True;
+ myStatus = GeomFill_PipeOk;
}
return Ok;
App.VDegree());
Standard_Real t2d;
App.TolReached(myError, t2d);
- myIsDone = Standard_True;
+ myStatus = GeomFill_PipeOk;
}
}
#include <GeomFill_Trihedron.hxx>
#include <GeomAbs_Shape.hxx>
#include <TColGeom_SequenceOfCurve.hxx>
+#include <GeomFill_PipeError.hxx>
class Geom_Surface;
class GeomFill_LocationLaw;
//! Returns whether approximation was done.
Standard_Boolean IsDone() const;
-
+ //! Returns execution status
+ GeomFill_PipeError GetStatus() const
+ {
+ return myStatus;
+ }
protected:
Standard_EXPORT Standard_Boolean KPartT4();
-
- Standard_Boolean myIsDone;
+ GeomFill_PipeError myStatus;//!< Execution status
Standard_Real myRadius;
Standard_Real myError;
Handle(Adaptor3d_Curve) myAdpPath;
Standard_Boolean myExchUV;
Standard_Boolean myKPart;
Standard_Boolean myPolynomial;
-
-
};
//=======================================================================
inline Standard_Boolean GeomFill_Pipe::IsDone() const
{
- return myIsDone;
+ return myStatus == GeomFill_PipeOk;
}
-
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;
myTrimmed = myCurve;
+ return Standard_True;
}
//==================================================================
public:
-
- Standard_EXPORT virtual void SetCurve (const Handle(Adaptor3d_Curve)& C);
+ //! initialize curve of trihedron law
+ //! @return Standard_True
+ Standard_EXPORT virtual Standard_Boolean SetCurve (const Handle(Adaptor3d_Curve)& C);
Standard_EXPORT virtual Handle(GeomFill_TrihedronLaw) Copy() const = 0;
Pipe.Perform(1.e-4, Standard_False, Cont);
if (!Pipe.IsDone()) {
- di << "GeomFill_Pipe cannot make a surface\n";
- return 1;
+ di << "Error: GeomFill_Pipe cannot make a surface\n";
+ return 0;
}
Standard_Real Accuracy = Pipe.ErrorOnSurf();
--- /dev/null
+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