#ifndef PRO2DENTDEF_H
#define PRO2DENTDEF_H

#include <ProObjects.h>
#include <ProSizeConst.h>



PRO_BEGIN_C_DECLS

typedef enum
{
 PRO_2D_POINT           = 1,
 PRO_2D_LINE            = 2,
 PRO_2D_CENTER_LINE     = 3,
 PRO_2D_ARC             = 4,
 PRO_2D_CIRCLE          = 5,
 PRO_2D_COORD_SYS       = 6,
 PRO_2D_POLYLINE        = 7,
 PRO_2D_SPLINE          = 8,
 PRO_2D_TEXT            = 9,
 PRO_2D_CONSTR_CIRCLE   = 10,
 PRO_2D_BLEND_VERTEX    = 11,
 PRO_2D_ELLIPSE         = 12,
 PRO_2D_CONIC           = 13,
 PRO_2D_SEC_GROUP       = 14,
 PRO_2D_B_SPLINE        = 15,
 PRO_2D_COMPOSITE_CURVE = 16,

 /* Please consult with Creo Parametric TOOLKIT group before adding types. */
 PRO_2D_ENT_LAST      = 17 /* Please update PRO_2D_ENT_LAST when adding to 
                              here */
} Pro2dEntType;

#define PRO_2D_ENT_COUNT PRO_2D_ENT_LAST

typedef enum
{
 PRO_2D_SPLINE_TAN_NONE     = 0,
 PRO_2D_SPLINE_TAN_START    = 1,
 PRO_2D_SPLINE_TAN_END      = 2,
 PRO_2D_SPLINE_TAN_BOTH     = 3,
 PRO_2D_SPLINE_TAN_PERIODIC = 4
} Pro2dSplineTanType;

typedef struct
{
 Pro2dEntType    type;
} Pro2dEntdef;


typedef struct
{
 Pro2dEntType    type;	/* PRO_2D_POINT, PRO_2D_COORD_SYS */
 Pro2dPnt        pnt;
} Pro2dPointdef, Pro2dCoordSysdef;

typedef struct
{
 Pro2dEntType    type;	/* PRO_2D_LINE, PRO_2D_CENTER_LINE */
 Pro2dPnt        end1;
 Pro2dPnt        end2;
} Pro2dLinedef, Pro2dClinedef;
 
typedef struct
{
 Pro2dEntType    type;	/* PRO_2D_ARC */
 Pro2dPnt        center;
 ProAngle        start_angle;
 ProAngle        end_angle;
 double          radius;
} Pro2dArcdef;

typedef struct
{
 Pro2dEntType    type;      /* PRO_2D_CIRCLE */
 Pro2dPnt        center;
 double          radius;
} Pro2dCircledef;

typedef struct
{
 Pro2dEntType     type;      /* PRO_2D_POLYLINE */
 unsigned int     n_points;
 Pro2dPnt        *point_arr;
} Pro2dPolylinedef;


typedef struct
{
 Pro2dEntType           type;           /* PRO_2D_SPLINE */
 Pro2dSplineTanType     tangency_type;
 unsigned int	       	n_points;
 Pro2dPnt	             *point_arr;
 ProAngle               start_tang_angle;
 ProAngle               end_tang_angle;
} Pro2dSplinedef;

typedef struct
{
  Pro2dEntType     type;   /* PRO_2D_TEXT */
  Pro2dPnt         first_corner;
  Pro2dPnt         second_corner;
  ProComment       string;
  ProComment       font_name; /* For Creo Parametric default, leave this field blank */
} Pro2dTextdef;

typedef struct
{
  Pro2dEntType    type;	/* PRO_2D_BLEND_VERTEX */
  Pro2dPnt        pnt;
  int             depth_level; /* The index for a subsequent blend vertex
                                * at the specified point "pnt".
                                * Note: if "pnt" vectors of two or more blend
                                * vertices are not exactly same, they will be
                                * decided to belong to the same point based
                                * on "Same Points" assumption conditions.
                                */
} Pro2dBlendVertexdef;         /* This entity may not be explicitly created.
                                * Please use ProSectionBlendVertexSet() instead.
                                */

typedef struct
{
 Pro2dEntType    type;      /* PRO_2D_ELLIPSE */
 Pro2dPnt        origin;
 double          x_radius;
 double          y_radius;
} Pro2dEllipsedef;

typedef struct
{
 Pro2dEntType    type;      /* PRO_2D_CONIC */
 Pro2dPnt        first_end_point;
 Pro2dPnt        second_end_point;
 Pro2dPnt        shoulder_point; 
 double          parameter;
} Pro2dConicdef;

typedef struct
{
 Pro2dEntType    type;
 Pro2dPnt        att_point;
} Pro2dSecGroupdef;

typedef struct
{
  Pro2dEntType type;          /* PRO_2D_B_SPLINE */
  int          degree;        /* Basis functions degree */
  int          num_knots;     /* The size for the params array */
  double      *params;        /* ProArray of knots on the parameter line */
  int          num_c_points;  /* The size for c_pnts (and weights if not NULL) */
  Pro2dPnt    *c_pnts;        /* ProArray of control points */
  double      *weights;       /* In the case of rational B-splines, a
                                 ProArray of the same dimension as
                                 array of c_pnts. Otherwise == NULL */
} Pro2dBSplinedef;

/* Currently end points are the only available data for this entity type.
   This entity type can not be added to section manually. */
typedef struct 
{
  Pro2dEntType type;  /* PRO_2D_COMPOSITE_CURVE */ 
  Pro2dPnt end1; 
  Pro2dPnt end2;

} Pro2dCompCurvedef; 

PRO_END_C_DECLS

#endif