// File generated by CPPExt (Transient)
//
//
//                     Copyright (C) 1991 - 2000 by  
//                      Matra Datavision SA.  All rights reserved.
//  
//                     Copyright (C) 2001 - 2004 by
//                     Open CASCADE SA.  All rights reserved.
// 
// This file is part of the Open CASCADE Technology software.
//
// This software may be distributed and/or modified under the terms and
// conditions of the Open CASCADE Public License as defined by Open CASCADE SA
// and appearing in the file LICENSE included in the packaging of this file.
//  
// This software is distributed on an "AS IS" basis, without warranty of any
// kind, and Open CASCADE SA hereby disclaims all such warranties,
// including without limitation, any warranties of merchantability, fitness
// for a particular purpose or non-infringement. Please see the License for
// the specific terms and conditions governing rights and limitations under the
// License.

#ifndef _BRepFill_PipeShell_HeaderFile
#define _BRepFill_PipeShell_HeaderFile

#ifndef _Standard_HeaderFile
#include <Standard.hxx>
#endif
#ifndef _Handle_BRepFill_PipeShell_HeaderFile
#include <Handle_BRepFill_PipeShell.hxx>
#endif

#ifndef _TopoDS_Wire_HeaderFile
#include <TopoDS_Wire.hxx>
#endif
#ifndef _TopoDS_Shape_HeaderFile
#include <TopoDS_Shape.hxx>
#endif
#ifndef _BRepFill_SequenceOfSection_HeaderFile
#include <BRepFill_SequenceOfSection.hxx>
#endif
#ifndef _TopTools_DataMapOfShapeListOfShape_HeaderFile
#include <TopTools_DataMapOfShapeListOfShape.hxx>
#endif
#ifndef _Standard_Real_HeaderFile
#include <Standard_Real.hxx>
#endif
#ifndef _Handle_Law_Function_HeaderFile
#include <Handle_Law_Function.hxx>
#endif
#ifndef _Handle_BRepFill_LocationLaw_HeaderFile
#include <Handle_BRepFill_LocationLaw.hxx>
#endif
#ifndef _Handle_BRepFill_SectionLaw_HeaderFile
#include <Handle_BRepFill_SectionLaw.hxx>
#endif
#ifndef _Handle_TopTools_HArray2OfShape_HeaderFile
#include <Handle_TopTools_HArray2OfShape.hxx>
#endif
#ifndef _GeomFill_Trihedron_HeaderFile
#include <GeomFill_Trihedron.hxx>
#endif
#ifndef _BRepFill_TransitionStyle_HeaderFile
#include <BRepFill_TransitionStyle.hxx>
#endif
#ifndef _GeomFill_PipeError_HeaderFile
#include <GeomFill_PipeError.hxx>
#endif
#ifndef _MMgt_TShared_HeaderFile
#include <MMgt_TShared.hxx>
#endif
#ifndef _Standard_Boolean_HeaderFile
#include <Standard_Boolean.hxx>
#endif
#ifndef _Standard_Integer_HeaderFile
#include <Standard_Integer.hxx>
#endif
class Law_Function;
class BRepFill_LocationLaw;
class BRepFill_SectionLaw;
class TopTools_HArray2OfShape;
class Standard_DomainError;
class StdFail_NotDone;
class TopoDS_Wire;
class gp_Ax2;
class gp_Dir;
class TopoDS_Shape;
class TopoDS_Vertex;
class TopTools_ListOfShape;
class BRepFill_Section;
class BRepFill_Sweep;


//! Perform general sweeping construction <br>
class BRepFill_PipeShell : public MMgt_TShared {

public:
 // Methods PUBLIC
 // 

//! Set an sweep's mode <br>
//!         If no mode are setted, the mode use in MakePipe is used <br>
Standard_EXPORT BRepFill_PipeShell(const TopoDS_Wire& Spine);

//! Set an Frenet or an CorrectedFrenet trihedron <br>
//!          to  perform  the  sweeping <br>
Standard_EXPORT   void Set(const Standard_Boolean Frenet = Standard_False) ;

//! Set  an  fixed  trihedron  to  perform  the  sweeping <br>
//!         all sections will be parallel. <br>
Standard_EXPORT   void Set(const gp_Ax2& Axe) ;

//! Set an fixed  BiNormal  direction to  perform <br>
//!  the sweeping <br>
Standard_EXPORT   void Set(const gp_Dir& BiNormal) ;

//! Set support to the spine to define the BiNormal <br>
//!           at   the spine, like    the  normal the surfaces. <br>
//!  Warning: To  be  effective,  Each  edge  of  the  <spine>  must <br>
//!  have an  representaion  on   one   face  of<SpineSupport> <br>
Standard_EXPORT   Standard_Boolean Set(const TopoDS_Shape& SpineSupport) ;

//! Set  an  auxiliary  spine  to  define  the Normal <br>
//!  For  each  Point  of  the  Spine  P,  an  Point  Q  is  evalued <br>
//!    on  <AuxiliarySpine> <br>
//! If <CurvilinearEquivalence> <br>
//!   Q split <AuxiliarySpine> with  the  same  length ratio <br>
//!   than P split  <Spline>. <br>
//! Else  the  plan  define  by  P  and  the  tangent  to  the  <Spine> <br>
//!       intersect <AuxiliarySpine> in Q. <br>
//! If <KeepContact> the  Normal  is  defined to  assume like  the  sweeped <br>
//!                  section is  in  contact to  the  <AuxiliarySpine> <br>
//! Else  the  Normal  is  defined  by the vector  PQ. <br>//! Give section to sweep. <br>
//! Possibilities are : <br>
//!	- Give one or sevral profile <br>
//!     - Give one profile and an homotetic law. <br>
//!     - Automatic compute of correspondance beetween profile, and section <br>
//!                 on the sweeped shape <br>
//!     - correspondance beetween profile, and section on the sweeped shape <br>
//!       defined by a vertex of the spine <br>
Standard_EXPORT   void Set(const TopoDS_Wire& AuxiliarySpine,const Standard_Boolean CurvilinearEquivalence = Standard_True,const Standard_Boolean KeepContact = Standard_False) ;

//! Set an section. The corespondance with the spine, will <br>
//!          be automaticaly performed. <br>
Standard_EXPORT   void Add(const TopoDS_Shape& Profile,const Standard_Boolean WithContact = Standard_False,const Standard_Boolean WithCorrection = Standard_False) ;

//! Set an section.   The corespondance with the spine, is <br>
//!          given by  <Location> <br>
Standard_EXPORT   void Add(const TopoDS_Shape& Profile,const TopoDS_Vertex& Location,const Standard_Boolean WithContact = Standard_False,const Standard_Boolean WithCorrection = Standard_False) ;

//! Set  an    section  and  an   homotetic    law. <br>
//! The  homotetie's  centers  is  given  by  point  on  the  <Spine>. <br>
Standard_EXPORT   void SetLaw(const TopoDS_Shape& Profile,const Handle(Law_Function)& L,const Standard_Boolean WithContact = Standard_False,const Standard_Boolean WithCorrection = Standard_False) ;

//! Set  an    section  and  an   homotetic    law. <br>
//!   The  homotetie  center  is  given  by  point  on  the  <Spine> <br>
Standard_EXPORT   void SetLaw(const TopoDS_Shape& Profile,const Handle(Law_Function)& L,const TopoDS_Vertex& Location,const Standard_Boolean WithContact = Standard_False,const Standard_Boolean WithCorrection = Standard_False) ;

//! Delete an section. <br>
Standard_EXPORT   void Delete(const TopoDS_Shape& Profile) ;

//! Say if <me> is ready to build the shape <br>
//!          return False if <me> do not have section definition <br>
Standard_EXPORT   Standard_Boolean IsReady() const;

//! Get a status, when Simulate or Build failed. <br>
Standard_EXPORT   GeomFill_PipeError GetStatus() const;


Standard_EXPORT   void SetTolerance(const Standard_Real Tol3d = 1.0e-4,const Standard_Real BoundTol = 1.0e-4,const Standard_Real TolAngular = 1.0e-2) ;

//! Set the  Transition Mode to manage discontinuities <br>
//!          on the sweep. <br>
Standard_EXPORT   void SetTransition(const BRepFill_TransitionStyle Mode = BRepFill_Modified,const Standard_Real Angmin = 1.0e-2,const Standard_Real Angmax = 6.0) ;

//! Perform simulation of the sweep : <br>
//!         Somes Section are returned. <br>
Standard_EXPORT   void Simulate(const Standard_Integer NumberOfSection,TopTools_ListOfShape& Sections) ;

//! Builds the resulting shape (redefined from MakeShape). <br>
Standard_EXPORT   Standard_Boolean Build() ;

//! Transform the sweeping Shell in Solid. <br>
//!          If the section are not closed returns False <br>
Standard_EXPORT   Standard_Boolean MakeSolid() ;

//! Returns the result Shape. <br>
Standard_EXPORT  const TopoDS_Shape& Shape() const;

//! Returns the  TopoDS  Shape of the bottom of the sweep. <br>
Standard_EXPORT  const TopoDS_Shape& FirstShape() const;

//! Returns the TopoDS Shape of the top of the sweep. <br>
Standard_EXPORT  const TopoDS_Shape& LastShape() const;

//! Returns the  list   of shapes generated   from the <br>
//!          shape <S>. <br>
Standard_EXPORT   void Generated(const TopoDS_Shape& S,TopTools_ListOfShape& L) ;
//Standard_EXPORT ~BRepFill_PipeShell();




 // Type management
 //
 Standard_EXPORT const Handle(Standard_Type)& DynamicType() const;
 //Standard_EXPORT Standard_Boolean	       IsKind(const Handle(Standard_Type)&) const;

protected:

 // Methods PROTECTED
 // 


 // Fields PROTECTED
 //


private: 

 // Methods PRIVATE
 // 


Standard_EXPORT   void Prepare() ;


Standard_EXPORT   void Place(const BRepFill_Section& Sec,TopoDS_Wire& W,Standard_Real& param) ;


Standard_EXPORT   void ResetLoc() ;


Standard_EXPORT   void BuildHistory(const BRepFill_Sweep& theSweep) ;


 // Fields PRIVATE
 //
TopoDS_Wire mySpine;
TopoDS_Shape myFirst;
TopoDS_Shape myLast;
TopoDS_Shape myShape;
BRepFill_SequenceOfSection mySeq;
TopTools_DataMapOfShapeListOfShape myGenMap;
Standard_Real myTol3d;
Standard_Real myBoundTol;
Standard_Real myTolAngular;
Standard_Real angmin;
Standard_Real angmax;
Handle_Law_Function myLaw;
Handle_BRepFill_LocationLaw myLocation;
Handle_BRepFill_SectionLaw mySection;
Handle_TopTools_HArray2OfShape myFaces;
GeomFill_Trihedron myTrihedron;
BRepFill_TransitionStyle myTransition;
GeomFill_PipeError myStatus;


};





// other Inline functions and methods (like "C++: function call" methods)
//


#endif
