// This file is generated by WOK (CPPExt).
// Please do not edit this file; modify original file instead.
// The copyright and license terms as defined for the original file apply to 
// this header file considered to be the "object code" form of the original source.

#ifndef _BRepPrim_OneAxis_HeaderFile
#define _BRepPrim_OneAxis_HeaderFile

#include <Standard.hxx>
#include <Standard_DefineAlloc.hxx>
#include <Standard_Macro.hxx>

#include <BRepPrim_Builder.hxx>
#include <gp_Ax2.hxx>
#include <Standard_Real.hxx>
#include <TopoDS_Shell.hxx>
#include <Standard_Boolean.hxx>
#include <TopoDS_Vertex.hxx>
#include <TopoDS_Edge.hxx>
#include <TopoDS_Wire.hxx>
#include <TopoDS_Face.hxx>
class Standard_DomainError;
class Standard_OutOfRange;
class BRepPrim_Builder;
class gp_Ax2;
class TopoDS_Face;
class TopoDS_Edge;
class gp_Pnt2d;
class TopoDS_Shell;
class TopoDS_Wire;
class TopoDS_Vertex;


//! Algorithm to  build  primitives with  one  axis of
//! revolution.
//!
//! The revolution  body is described by :
//!
//! A coordinate  system (Ax2 from  gp). The Z axis is
//! the rotational axis.
//!
//! An Angle around the Axis, When  the Angle  is 2*PI
//! the primitive is not limited  by planar faces. The
//! U parameter range from 0 to Angle.
//!
//! A parameter range VMin, VMax on the meridian.
//!
//! A meridian : The  meridian is a curve described by
//! a set of deferred methods.
//!
//! The  topology consists of  A shell,  Faces,  Wires,
//! Edges and Vertices.  Methods  are provided to build
//! all the elements.  Building an element  implies the
//! automatic building  of  all its  sub-elements.
//!
//! So building the shell builds everything.
//!
//! There are at most 5 faces :
//!
//! - The LateralFace.
//!
//! - The TopFace and the BottomFace.
//!
//! - The StartFace and the EndFace.
class BRepPrim_OneAxis 
{
public:

  DEFINE_STANDARD_ALLOC

  
  Standard_EXPORT virtual   void Delete() ;
~BRepPrim_OneAxis()
{
  Delete();
}
  
  //! The MeridianOffset is added  to the  parameters on
  //! the meridian curve and  to  the  V values  of  the
  //! pcurves. This is  used for the sphere for example,
  //! to give a range on the meridian  edge which is not
  //! VMin, VMax.
  Standard_EXPORT   void SetMeridianOffset (const Standard_Real MeridianOffset = 0) ;
  
  //! Returns the Ax2 from <me>.
  Standard_EXPORT  const  gp_Ax2& Axes()  const;
  
  Standard_EXPORT   void Axes (const gp_Ax2& A) ;
  
  Standard_EXPORT   Standard_Real Angle()  const;
  
  Standard_EXPORT   void Angle (const Standard_Real A) ;
  
  Standard_EXPORT   Standard_Real VMin()  const;
  
  Standard_EXPORT   void VMin (const Standard_Real V) ;
  
  Standard_EXPORT   Standard_Real VMax()  const;
  
  Standard_EXPORT   void VMax (const Standard_Real V) ;
  
  //! Returns a face with  no edges.  The surface is the
  //! lateral surface with normals pointing outward. The
  //! U parameter is the angle with the  origin on the X
  //! axis. The  V parameter is   the  parameter of  the
  //! meridian.
  Standard_EXPORT virtual   TopoDS_Face MakeEmptyLateralFace()  const = 0;
  
  //! Returns  an  edge with  a 3D curve   made from the
  //! meridian  in the XZ  plane rotated by <Ang> around
  //! the Z-axis. Ang may be 0 or myAngle.
  Standard_EXPORT virtual   TopoDS_Edge MakeEmptyMeridianEdge (const Standard_Real Ang)  const = 0;
  
  //! Sets the  parametric curve of the  edge <E> in the
  //! face  <F> to be  the   2d representation  of   the
  //! meridian.
  Standard_EXPORT virtual   void SetMeridianPCurve (TopoDS_Edge& E, const TopoDS_Face& F)  const = 0;
  
  //! Returns the meridian point at parameter <V> in the
  //! plane XZ.
  Standard_EXPORT virtual   gp_Pnt2d MeridianValue (const Standard_Real V)  const = 0;
  
  //! Returns True if the point of  parameter <V> on the
  //! meridian is on the Axis. Default implementation is
  //! Abs(MeridianValue(V).X()) < Precision::Confusion()
  Standard_EXPORT virtual   Standard_Boolean MeridianOnAxis (const Standard_Real V)  const;
  
  //! Returns True  if the  meridian is  closed. Default
  //! implementation                                  is
  //! MeridianValue(VMin).IsEqual(MeridianValue(VMax),
  //! Precision::Confusion())
  Standard_EXPORT virtual   Standard_Boolean MeridianClosed()  const;
  
  //! Returns  True   if  VMax    is  infinite.  Default
  //! Precision::IsPositiveInfinite(VMax);
  Standard_EXPORT virtual   Standard_Boolean VMaxInfinite()  const;
  
  //! Returns  True   if  VMin    is  infinite.  Default
  //! Precision::IsNegativeInfinite(VMax);
  Standard_EXPORT virtual   Standard_Boolean VMinInfinite()  const;
  
  //! Returns True if  there is  a top  face.
  //!
  //! That is neither : VMaxInfinite()
  //! MeridianClosed()
  //! MeridianOnAxis(VMax)
  Standard_EXPORT virtual   Standard_Boolean HasTop()  const;
  
  //! Returns   True if there is   a bottom  face.
  //!
  //! That is neither : VMinInfinite()
  //! MeridianClosed()
  //! MeridianOnAxis(VMin)
  Standard_EXPORT virtual   Standard_Boolean HasBottom()  const;
  
  //! Returns True if  there are Start   and  End faces.
  //!
  //! That is : 2*PI  - Angle > Precision::Angular()
  Standard_EXPORT virtual   Standard_Boolean HasSides()  const;
  
  //! Returns the Shell containing all the  Faces of the
  //! primitive.
  Standard_EXPORT  const  TopoDS_Shell& Shell() ;
  
  //! Returns  the lateral Face.   It is oriented toward
  //! the outside of the primitive.
  Standard_EXPORT  const  TopoDS_Face& LateralFace() ;
  
  //! Returns the   top planar  Face.    It  is Oriented
  //! toward the +Z axis (outside).
  Standard_EXPORT  const  TopoDS_Face& TopFace() ;
  
  //! Returns  the Bottom planar Face.   It is  Oriented
  //! toward the -Z axis (outside).
  Standard_EXPORT  const  TopoDS_Face& BottomFace() ;
  
  //! Returns  the  Face   starting   the slice, it   is
  //! oriented toward the exterior of the primitive.
  Standard_EXPORT  const  TopoDS_Face& StartFace() ;
  
  //! Returns the Face ending the slice, it  is oriented
  //! toward the exterior of the primitive.
  Standard_EXPORT  const  TopoDS_Face& EndFace() ;
  
  //! Returns  the wire in the lateral face.
  Standard_EXPORT  const  TopoDS_Wire& LateralWire() ;
  
  //! Returns the   wire in the   lateral  face with the
  //! start edge.
  Standard_EXPORT  const  TopoDS_Wire& LateralStartWire() ;
  
  //! Returns the wire with in lateral face with the end
  //! edge.
  Standard_EXPORT  const  TopoDS_Wire& LateralEndWire() ;
  
  //! Returns the wire in the top face.
  Standard_EXPORT  const  TopoDS_Wire& TopWire() ;
  
  //! Returns the wire in the bottom face.
  Standard_EXPORT  const  TopoDS_Wire& BottomWire() ;
  
  //! Returns the wire  in the  start face.
  Standard_EXPORT  const  TopoDS_Wire& StartWire() ;
  
  //! Returns  the wire   in the  start   face  with the
  //! AxisEdge.
  Standard_EXPORT  const  TopoDS_Wire& AxisStartWire() ;
  
  //! Returns the Wire in   the end face.
  Standard_EXPORT  const  TopoDS_Wire& EndWire() ;
  
  //! Returns  the Wire  in  the   end   face  with  the
  //! AxisEdge.
  Standard_EXPORT  const  TopoDS_Wire& AxisEndWire() ;
  
  //! Returns the Edge built along the Axis and oriented
  //! on +Z of the Axis.
  Standard_EXPORT  const  TopoDS_Edge& AxisEdge() ;
  
  //! Returns the   Edge at angle 0.
  Standard_EXPORT  const  TopoDS_Edge& StartEdge() ;
  
  //! Returns the  Edge at  angle Angle.  If !HasSides()
  //! the StartEdge and the EndEdge are the same edge.
  Standard_EXPORT  const  TopoDS_Edge& EndEdge() ;
  
  //! Returns the linear Edge between start Face and top
  //! Face.
  Standard_EXPORT  const  TopoDS_Edge& StartTopEdge() ;
  
  //! Returns the linear  Edge between  start  Face  and
  //! bottom Face.
  Standard_EXPORT  const  TopoDS_Edge& StartBottomEdge() ;
  
  //! Returns the linear Edge  between end Face and  top
  //! Face.
  Standard_EXPORT  const  TopoDS_Edge& EndTopEdge() ;
  
  //! Returns  the  linear  Edge  between end  Face  and
  //! bottom Face.
  Standard_EXPORT  const  TopoDS_Edge& EndBottomEdge() ;
  
  //! Returns the edge at VMax. If  MeridianClosed() the
  //! TopEdge and the BottomEdge are the same edge.
  Standard_EXPORT  const  TopoDS_Edge& TopEdge() ;
  
  //! Returns the edge  at VMin. If MeridianClosed() the
  //! TopEdge and the BottomEdge are the same edge.
  Standard_EXPORT  const  TopoDS_Edge& BottomEdge() ;
  
  //! Returns the Vertex at the Top altitude on the axis.
  Standard_EXPORT  const  TopoDS_Vertex& AxisTopVertex() ;
  
  //! Returns the Vertex  at the Bottom  altitude on the
  //! axis.
  Standard_EXPORT  const  TopoDS_Vertex& AxisBottomVertex() ;
  
  //! Returns the vertex (0,VMax)
  Standard_EXPORT  const  TopoDS_Vertex& TopStartVertex() ;
  
  //! Returns the vertex (angle,VMax)
  Standard_EXPORT  const  TopoDS_Vertex& TopEndVertex() ;
  
  //! Returns the vertex (0,VMin)
  Standard_EXPORT  const  TopoDS_Vertex& BottomStartVertex() ;
  
  //! Returns the vertex (angle,VMax)
  Standard_EXPORT  const  TopoDS_Vertex& BottomEndVertex() ;




protected:

  
  //! Creates a OneAxis algorithm.  <B> is used to build
  //! the Topology. The angle defaults to 2*PI.
  Standard_EXPORT BRepPrim_OneAxis(const BRepPrim_Builder& B, const gp_Ax2& A, const Standard_Real VMin, const Standard_Real VMax);


  BRepPrim_Builder myBuilder;


private:



  gp_Ax2 myAxes;
  Standard_Real myAngle;
  Standard_Real myVMin;
  Standard_Real myVMax;
  Standard_Real myMeridianOffset;
  TopoDS_Shell myShell;
  Standard_Boolean ShellBuilt;
  TopoDS_Vertex myVertices[6];
  Standard_Boolean VerticesBuilt[6];
  TopoDS_Edge myEdges[9];
  Standard_Boolean EdgesBuilt[9];
  TopoDS_Wire myWires[9];
  Standard_Boolean WiresBuilt[9];
  TopoDS_Face myFaces[5];
  Standard_Boolean FacesBuilt[5];


};







#endif // _BRepPrim_OneAxis_HeaderFile
