#ifndef PROSURFACEDATA_H
#define PROSURFACEDATA_H

#include   <ProObjects.h>
#include   <ProContourdata.h>
#include   <ProEdgedata.h>

/*
   Function declarations and specific data structures for ProSurfacedata
*/




PRO_BEGIN_C_DECLS

/*===========================================================================*/

/* -----------------------------------------------------------------------
                  Surface shape data structures
   ----------------------------------------------------------------------- */

typedef struct Ptc_plane
{
    ProVector  e1, e2, e3;
    Pro3dPnt   origin;
                                /* Local coordinate system. */
} ProPlanedata;

typedef struct ptc_cylinder
{
    ProVector  e1, e2, e3;
    Pro3dPnt   origin;
    double     radius;
} ProCylinderdata;

typedef struct ptc_cone
{
    ProVector  e1, e2, e3;
    Pro3dPnt   origin;
    double     alpha;
} ProConedata;

typedef struct ptc_torus
{
    ProVector  e1, e2, e3;
    Pro3dPnt   origin;
    double     radius1;
    double     radius2;
} ProTorusdata;

typedef struct ptc_srfrev
{
    ProVector    e1, e2, e3;
    Pro3dPnt     origin;
    ProCurvedata curve;
} ProSrfrevdata;

typedef struct ptc_rulsrf
{
    ProVector      e1, e2, e3;
    Pro3dPnt       origin;
    ProCurvedata   curve_1;
    ProCurvedata   curve_2;
} ProRulsrfdata;

typedef struct ptc_tabcyl
{
    ProVector    e1, e2, e3;
    Pro3dPnt     origin;
    ProCurvedata curve;
} ProTabcyldata;

typedef struct ptc_coons
{
    ProCurvedata  le_curve;               /* u = 0 boundary. */
    ProCurvedata  ri_curve;               /* u = 1 boundary. */
    ProCurvedata  dn_curve;               /* v = 0 boundary. */
    ProCurvedata  up_curve;               /* v = 1 boundary. */
    Pro3dPnt      point_matrix[2][2];     /* Corner points. */
    Pro3dPnt      uvder_matrix[2][2];     /* Corner mixed derivatives. */
} ProCoonsdata;

typedef struct ptc_filsrf
{
    ProSplinedata  pnt_spline;    /* Spline running along u = 0 boundary. */
    ProSplinedata  ctr_spline;    /* Spline running along "axis".         */
    ProSplinedata  tan_spline;    /* Spline of unit tangents along axis.  */
} ProFilsrfdata;

typedef struct ptc_splsrf
{
    double   *u_par_arr;    /* Array of U parameter grid */
    double   *v_par_arr;    /* Array of V parameter grid */
    Pro3dPnt *point_arr;    /* Array of interpolant points */
    Pro3dPnt *u_tan_arr;    /* Array of U derivatives at these points */
    Pro3dPnt *v_tan_arr;    /* Array of V derivatives at these points */
    Pro3dPnt *uvder_arr;    /* Array of UV derivatives at the interpolant points */    
    int       num_u;        /* Size in U */
    int       num_v;        /* Size in V */
} ProSplinesrfdata;

typedef struct ptc_splsrf2ndDer
{
    double    *u_par_arr;    /* Array of U parameter grid */
    double    *v_par_arr;    /* Array of V parameter grid */
    Pro3dPnt  *point_arr;    /* Array of interpolant points */
    Pro3dPnt  *u_tan_arr;    /* Array of U derivatives at these points */
    Pro3dPnt  *v_tan_arr;    /* Array of V derivatives at these points */
    Pro3dPnt  *uvder_arr;    /* Array of UV derivatives at the interpolant points */
    Pro3dPnt  *u_der2_arrs[2]; /* Array of U 2nd derivatives in V bound. point */
    Pro3dPnt  *v_der2_arrs[2]; /* Array of V 2nd derivatives in U bound. point */
    Pro3dPnt  *uuv_der[2];     /* Array of UUV 3rd derivatives */
    Pro3dPnt  *vvu_der[2];     /* Array of VVU 3rd derivatives */
    Pro3dPnt  *der4[4];        /* UUVV derivatives at the corners */
    int       num_u;        /* Size in U */
    int       num_v;        /* Size in V */
} ProSpline2ndDersrfdata;

typedef struct ptc_gen_splsrf
{
    ProVector         e1, e2, e3;
    Pro3dPnt          origin; /* Local coordinate system. */
    ProSplinesrfdata  splsrf;                /* In appropriate coordinates */
} ProCylsplsrfdata, ProSphsplsrfdata;

typedef struct ptc_b_splsrf
{
    int       deg[2];        /* Basis functions degrees (in directions
                                U and V). */
    double   *u_par_arr;     /* Expandable array of knots on the
                                parameter line, U. */
    double   *v_par_arr;     /* Expandable array of knots on the
                                parameter line, V*/
    double   *wghts;         /* In the case of rational B-splines, this is
                                an expandable array of the same dimension
                                as the array of c_point_arr. Otherwise,
				this is NULL. */
    Pro3dPnt *c_point_arr;   /* Expandable array of control points. */
    int       num_u;         /* The size in U. */
    int       num_v;         /* The size in V. */
    int       num_c_point;   /* The number of control points. */
} ProBsplinesrfdata;

typedef struct Ptc_frgnsrf
{
    ProVector  e1, e2, e3;
    Pro3dPnt   origin;
                                 /* Local coordinate system. */
    int        foreign_id;       /* foreign_id returned from user_init_surf*/
} ProFrgnsrfdata;

typedef union ptc_srfshape
{
    ProPlanedata      plane;
    ProCylinderdata   cylinder;
    ProConedata       cone;
    ProTorusdata      torus;
    ProSrfrevdata     srfrev;
    ProTabcyldata     tabcyl;
    ProRulsrfdata     rulsrf;
    ProCoonsdata      coons;
    ProFilsrfdata     filsrf;
    ProSplinesrfdata  spl_srf;
    ProBsplinesrfdata b_spl_srf;
    ProCylsplsrfdata  cyl_splsrf;
    ProFrgnsrfdata    frgnsrf;
    ProSpline2ndDersrfdata splsrf_2ndder;
} ProSurfaceshapedata;

typedef enum pro_srf_type
{
    PRO_SRF_NONE =     -3,
    PRO_SRF_PLANE =    34,
    PRO_SRF_CYL =      36,
    PRO_SRF_CONE =     37,
    PRO_SRF_TORUS =    38,
    PRO_SRF_COONS =    39,
    PRO_SRF_SPL =      40,
    PRO_SRF_FIL =      41,
    PRO_SRF_RUL =      42,
    PRO_SRF_REV =      43,
    PRO_SRF_TABCYL =   44,
    PRO_SRF_B_SPL =    45,
    PRO_SRF_FOREIGN =  46,
    PRO_SRF_CYL_SPL =  48,
    PRO_SRF_SPL2DER =  50
} ProSrftype;

typedef enum pro_surf_orient
{
    PRO_SURF_ORIENT_NONE	=  0,
    PRO_SURF_ORIENT_OUT		=  1,	/* if du x dv points outside */
    PRO_SURF_ORIENT_IN		= -1	/* if du x dv points inside */ 
} ProSurfaceOrient;

typedef struct ptc_surf
{
    ProSrftype          type;           /* Surface type */         
    ProUvParam          uv_min;         /* Minimum UV extents */
    ProUvParam          uv_max;         /* Maximum UV extents */
    ProPoint3d          xyz_min;        /* Minimum XYZ extents (approximate) */ 
                                        /* Use only for output (from 
                                           Creo Parametric TOOLKIT) purpose only */
    ProPoint3d          xyz_max;        /* Maximum XYZ extents (approximate) */ 
                                        /* Use only for output (from 
                                           Creo Parametric TOOLKIT) purpose only */
    ProSurfaceOrient    orient;
    ProSurfaceshapedata srf_shape;
    int                 user_int[4];    /* Space for user integer data */
    int                 id;             /* The surface identifier */
    char               *user_ptr[4];    /* Space for user pointer data */
    ProContourdata     *contour_arr;    /* ProArray of ProContourdata 
					   structures */
} ProSurfacedata;

LIB_PTK_INTF_API  ProError ProSurfacedataAlloc ( ProSurfacedata **pp_surf_data );
/*
    Purpose: Allocates memory for a surface data structure.

    Input Arguments:
        none

    Output Arguments:
        pp_surf_data - The surface data structure

    Return Values:
        PRO_TK_NO_ERROR - The function successfully allocated memory for the 
                          data structure.
        PRO_TK_OUT_OF_MEMORY - Insufficient memory.
        PRO_TK_BAD_INPUTS - The input is invalid.

*/

LIB_PTK_INTF_API  ProError ProSurfacedataFree ( ProSurfacedata *p_surf_data );
/*
    Purpose: Frees all underlying memory of the surface data structure.

    Input Arguments:
        p_surf_data - The surface data structure

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully freed the memory.
        PRO_TK_BAD_INPUTS - The argument is invalid.

*/

LIB_PTK_INTF_API  ProError ProSurfacedataMemoryFree ( ProSurfacedata *p_surf_data );
/*
    Purpose: Frees the top-level memory used by the surface data structure.

    Input Arguments:
        p_surf_data - The surface data structure

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully freed the memory.
        PRO_TK_BAD_INPUTS - The argument is invalid.

*/

LIB_PTK_INTF_API  ProError ProSurfacedataInit ( ProSrftype			surf_type,
				     ProUvParam			surf_uv_min,
				     ProUvParam			surf_uv_max,
				     ProSurfaceOrient		surf_orient,
				     ProSurfaceshapedata	*p_surf_shape,
				     int			surf_id,
				     ProSurfacedata *p_surf_data );
/*
    Purpose: Initializes a surface data structure.

    Input Arguments:
        surf_type - The surface type
        surf_uv_min - The surface minimum UV extents. <P>If you are using this 
                      data to create a feature via ProImportfeatCreate(), the 
                      extents are not used and can be set to {0.0, 0.0}
        surf_uv_max - The surface maximum UV extents <P>If you are using this 
                      data to create a feature via ProImportfeatCreate(), the 
                      extents are not used and can be set to {0.0, 0.0}
        surf_orient - The surface orientation
        p_surf_shape - The surface shape
        surf_id - The surface identifier

    Output Arguments:
        p_surf_data - The surface data structure

    Return Values:
        PRO_TK_NO_ERROR - The function successfully initialized the data 
                          structure.
        PRO_TK_BAD_INPUTS - One or more of the input arguments are invalid.

*/

extern ProError ProSurfacedataGet ( ProSurfacedata *p_surf_data,
				    ProSrftype			*p_surf_type,
				    ProUvParam			surf_uv_min,
				    ProUvParam			surf_uv_max,
				    ProSurfaceOrient		*p_surf_orient,
				    ProSurfaceshapedata		*p_surf_shape,
				    int				*p_surf_id );
/*
    Purpose: Retrieves information from the surface data structure.
             <p> NOTE:
             <p> The function ignores the output arguments with NULL pointers.

    Input Arguments:
        p_surf_data - The surface data structure

    Output Arguments:
        p_surf_type - The surface type
        surf_uv_min - The surface minimum UV extents
        surf_uv_max - The surface maximum UV extents
        p_surf_orient - The surface orientation
        p_surf_shape - The surface shape
        p_surf_id - The surface identifier

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the information.
        PRO_TK_BAD_INPUTS - The input argument is invalid.

*/

LIB_PTK_INTF_API  ProError ProSurfacedataContourArrayGet ( ProSurfacedata *p_surf_data,
						ProContourdata **r_contour_array );
/*
    Purpose: Retrieves an array of contours on the specified surface.

    Input Arguments:
        p_surf_data - The surface

    Output Arguments:
        r_contour_array - The <i>ProArray</i> of contours on the surface

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the array of 
                          contours.
        PRO_TK_BAD_INPUTS - The input argument is invalid.

*/

LIB_PTK_INTF_API  ProError ProSurfacedataContourArraySet ( ProSurfacedata *p_surf_data,
						ProContourdata *contour_array );
/*
    Purpose: Sets an array of contours on the surface.

    Input Arguments:
        p_surf_data - The surface
        contour_array - The <i>ProArray</i> of contours on the surface

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully set the array of contours.
        PRO_TK_BAD_INPUTS - One or more of the arguments are invalid.

*/

extern ProError ProPlanedataInit ( ProVector	e1,
				   ProVector	e2,
				   ProVector	e3,
				   Pro3dPnt	origin,
				   ProSurfaceshapedata *p_surf_shape );
/*
    Purpose: Initializes a plane surface data structure.

    Input Arguments:
        e1 - The X-axis of the coordinate system
        e2 - The Y-axis of the coordinate system
        e3 - The Z-axis of the coordinate system
        origin - The origin of the coordinate system

    Output Arguments:
        p_surf_shape - The plane surface

    Return Values:
        PRO_TK_NO_ERROR - The function successfully initialized the plane 
                          surface.
        PRO_TK_BAD_INPUTS - One or more of the input arguments are invalid.

*/

extern ProError ProPlanedataGet ( ProSurfaceshapedata *p_surf_shape,
				  ProVector	e1,
				  ProVector	e2,
				  ProVector	e3,
				  Pro3dPnt	origin );
/*
    Purpose: Retrieves information from the plane surface data structure.
             <p> NOTE:
             <p> The function ignores the output arguments with NULL pointers.

    Input Arguments:
        p_surf_shape - The plane surface data structure

    Output Arguments:
        e1 - The X-axis of the coordinate system
        e2 - The Y-axis of the coordinate system
        e3 - The Z-axis of the coordinate system
        origin - The origin of the coordinate system

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the information.
        PRO_TK_BAD_INPUTS - The input argument is invalid.

*/

extern ProError ProCylinderdataInit ( ProVector	e1,
				      ProVector	e2,
				      ProVector	e3,
				      Pro3dPnt	origin,
				      double		radius,
				      ProSurfaceshapedata *p_surf_shape );
/*
    Purpose: Initializes a cylinder surface data structure.

    Input Arguments:
        e1 - The X-axis of the coordinate system
        e2 - The Y-axis of the coordinate system
        e3 - The Z-axis of the coordinate system
        origin - The origin of the coordinate system
        radius - The radius of the cylinder

    Output Arguments:
        p_surf_shape - The cylinder surface

    Return Values:
        PRO_TK_NO_ERROR - The function successfully initialized the cylinder 
                          surface.
        PRO_TK_BAD_INPUTS - One or more of the input arguments are invalid.

*/

extern ProError ProCylinderdataGet ( ProSurfaceshapedata *p_surf_shape,
				     ProVector	e1,
				     ProVector	e2,
				     ProVector	e3,
				     Pro3dPnt	origin,
				     double	*p_radius );
/*
    Purpose: Retrieves information from the cylinder surface data structure.
             <p> NOTE:
             <p> The function ignores the output arguments with NULL pointers.

    Input Arguments:
        p_surf_shape - The cylinder surface data structure

    Output Arguments:
        e1 - The X-axis of the coordinate system
        e2 - The Y-axis of the coordinate system
        e3 - The Z-axis of the coordinate system
        origin - The origin of the coordinate system
        p_radius - The radius of the cylinder

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the information.
        PRO_TK_BAD_INPUTS - The input argument is invalid.

*/

extern ProError ProConedataInit ( ProVector	e1,
				  ProVector	e2,
				  ProVector	e3,
				  Pro3dPnt	origin,
				  double	alpha,
				  ProSurfaceshapedata	*p_surf_shape );
/*
    Purpose: Initializes a cone surface data structure.

    Input Arguments:
        e1 - The X-axis of the coordinate system
        e2 - The Y-axis of the coordinate system
        e3 - The Z-axis of the coordinate system
        origin - The origin of the coordinate system
        alpha - The alpha value

    Output Arguments:
        p_surf_shape - The cone surface

    Return Values:
        PRO_TK_NO_ERROR - The function successfully initialized the cone 
                          surface.
        PRO_TK_BAD_INPUTS - One or more of the input arguments are invalid.

*/

extern ProError ProConedataGet ( ProSurfaceshapedata *p_surf_shape,
				 ProVector	e1,
				 ProVector	e2,
				 ProVector	e3,
				 Pro3dPnt	origin,
				 double		*p_alpha );
/*
    Purpose: Retrieves information from the cone surface data structure.
             <p> NOTE: 
             <p> The function ignores the output arguments with NULL pointers.

    Input Arguments:
        p_surf_shape - The cone surface data structure

    Output Arguments:
        e1 - The X-axis of the coordinate system
        e2 - The Y-axis of the coordinate system
        e3 - The Z-axis of the coordinate system
        origin - The origin of the coordinate system
        p_alpha - The alpha value

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the information.
        PRO_TK_BAD_INPUTS - The input argument is invalid.

*/

extern ProError ProTorusdataInit ( ProVector	e1,
				   ProVector	e2,
				   ProVector	e3,
				   Pro3dPnt	origin,
				   double	radius1,
				   double	radius2,
				   ProSurfaceshapedata *p_surf_shape );
/*
    Purpose: Initializes a torus surface data structure.

    Input Arguments:
        e1 - The X-axis of the coordinate system
        e2 - The Y-axis of the coordinate system
        e3 - The Z-axis of the coordinate system
        origin - The origin of the coordinate system
        radius1 - The value of the first radius
        radius2 - The value of the second radius

    Output Arguments:
        p_surf_shape - The torus surface

    Return Values:
        PRO_TK_NO_ERROR - The function successfully initialized the torus 
                          surface.
        PRO_TK_BAD_INPUTS - One or more of the input arguments are invalid.

*/

extern ProError ProTorusdataGet ( ProSurfaceshapedata *p_surf_shape,
				  ProVector	e1,
				  ProVector	e2,
				  ProVector	e3,
				  Pro3dPnt	origin,
				  double	*p_radius1,
				  double	*p_radius2 );
/*
    Purpose: Retrieves information from the torus surface data structure.
             <p> NOTE:
             <p> The function ignores the output arguments with NULL pointers.

    Input Arguments:
        p_surf_shape - The torus surface data structure

    Output Arguments:
        e1 - The X-axis of the coordinate system
        e2 - The Y-axis of the coordinate system
        e3 - The Z-axis of the coordinate system
        origin - The origin of the coordinate system
        p_radius1 - The value of the first radius
        p_radius2 - The value of the second radius

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the information.
        PRO_TK_BAD_INPUTS - The input argument is invalid.

*/

extern ProError ProSrfrevdataInit ( ProVector	e1,
				    ProVector	e2,
				    ProVector	e3,
				    Pro3dPnt	origin,
				    ProCurvedata *p_curve,
				    ProSurfaceshapedata *p_surf_shape );
/*
    Purpose: Initializes a revolved surface data structure.

    Input Arguments:
        e1 - The X-axis of the coordinate system
        e2 - The Y-axis of the coordinate system
        e3 - The Z-axis of the coordinate system
        origin - The origin of coordinate system
        p_curve - The curve data

    Output Arguments:
        p_surf_shape - The revolved surface

    Return Values:
        PRO_TK_NO_ERROR - The function successfully initialized the revolved 
                          surface.
        PRO_TK_BAD_INPUTS - One or more of the input arguments are invalid.
        PRO_TK_BAD_SRF_CRV - Invalid type of curve.
        PRO_TK_BSPL_MULTI_INNER_KNOTS - The curve is a B-spline with multiple 
                                        inner knots.

*/

extern ProError ProSrfrevdataGet ( ProSurfaceshapedata *p_surf_shape,
				   ProVector	e1,
				   ProVector	e2,
				   ProVector	e3,
				   Pro3dPnt	origin,
				   ProCurvedata	*p_curve );
/*
    Purpose: Retrieves information from the revolved surface data structure.
             <p> NOTE:
             <p> The function ignores the output arguments with NULL pointers.

    Input Arguments:
        p_surf_shape - The revolved surface data structure

    Output Arguments:
        e1 - The X-axis of the coordinate system
        e2 - The Y-axis of the coordinate system
        e3 - The Z-axis of the coordinate system
        origin - The origin of the coordinate system
        p_curve - The curve

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the information.
        PRO_TK_BAD_INPUTS - The input argument is invalid.

*/

extern ProError ProTabcyldataInit ( ProVector	e1,
				    ProVector	e2,
				    ProVector	e3,
				    Pro3dPnt	origin,
				    ProCurvedata *p_curve,
				    ProSurfaceshapedata *p_surf_shape );
/*
    Purpose: Initializes a tabulated cylinder surface data structure.

    Input Arguments:
        e1 - The X-axis of the coordinate system
        e2 - The Y-axis of the coordinate system
        e3 - The Z-axis of the coordinate system
        origin - The origin of coordinate system
        p_curve - The curve data

    Output Arguments:
        p_surf_shape - The tabulated cylinder surface

    Return Values:
        PRO_TK_NO_ERROR - The function successfully initialized the tabulated 
                          cylinder surface.
        PRO_TK_BAD_INPUTS - One or more of the input arguments are invalid.
        PRO_TK_BAD_SRF_CRV - Invalid type of curve.
        PRO_TK_BSPL_MULTI_INNER_KNOTS - The curve is a B-spline with multiple 
                                        inner knots.

*/

extern ProError ProTabcyldataGet ( ProSurfaceshapedata *p_surf_shape,
				   ProVector	e1,
				   ProVector	e2,
				   ProVector	e3,
				   Pro3dPnt	origin,
				   ProCurvedata	*p_curve );
/*
    Purpose: Retrieves information from a tabulated cylinder surface data 
             structure.
             <p> NOTE:
             <p> The function ignores the output arguments with NULL pointers.

    Input Arguments:
        p_surf_shape - The tabulated cylinder surface data structure

    Output Arguments:
        e1 - The X-axis of the coordinate system
        e2 - The Y-axis of the coordinate system
        e3 - The Z-axis of the coordinate system
        origin - The origin of the coordinate system
        p_curve - The curve data

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the information.
        PRO_TK_BAD_INPUTS - The input argument is invalid.

*/

extern ProError ProRulsrfdataInit ( ProVector	e1,
				    ProVector	e2,
				    ProVector	e3,
				    Pro3dPnt	origin,
				    ProCurvedata *p_curve1,
				    ProCurvedata *p_curve2,
				    ProSurfaceshapedata *p_surf_shape );
/*
    Purpose: Initializes a ruled surface data structure.

    Input Arguments:
        e1 - The X-axis of the coordinate system
        e2 - The Y-axis of the coordinate system
        e3 - The Z-axis of the coordinate system
        origin - The origin of the coordinate system
        p_curve1 - The first curve
        p_curve2 - The second curve

    Output Arguments:
        p_surf_shape - The ruled surface

    Return Values:
        PRO_TK_NO_ERROR - The function successfully initialized the ruled 
                          surface.
        PRO_TK_BAD_INPUTS - One or more of the input arguments are invalid.
        PRO_TK_BAD_SRF_CRV - Invalid type of curve.
        PRO_TK_BSPL_MULTI_INNER_KNOTS - The curve is a B-spline with multiple 
                                        inner knots.

*/

extern ProError ProRulsrfdataGet ( ProSurfaceshapedata *p_surf_shape,
				   ProVector	e1,
				   ProVector	e2,
				   ProVector	e3,
				   Pro3dPnt	origin,
				   ProCurvedata	*p_curve1,
				   ProCurvedata	*p_curve2 );
/*
    Purpose: Retrieves information from the ruled surface data structure.
             <p> NOTE:
             <p> This function ignores the output arguments with NULL pointers.

    Input Arguments:
        p_surf_shape - The ruled surface data structure

    Output Arguments:
        e1 - The X-axis of the coordinate system
        e2 - The Y-axis of the coordinate system
        e3 - The Z-axis of the coordinate system
        origin - The origin of the coordinate system
        p_curve1 - The first curve
        p_curve2 - The second curve

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the information.
        PRO_TK_BAD_INPUTS - The input argument is invalid.
        PRO_TK_BAD_SRF_CRV - Invalid type of curve.
        PRO_TK_BSPL_MULTIPLE_INNER_KNOTS - The curve is a B-spline with 
                                           multiple inner knots.

*/

LIB_PTK_INTF_API  ProError ProSplinesrfdataInit ( double	*u_par_arr,
				       double	*v_par_arr,
				       Pro3dPnt *points_arr,
				       ProVector *u_tan_arr,
				       ProVector *v_tan_arr,
				       ProVector *uvdev_arr,
				       int	num_u,
				       int	num_v,
				       ProSurfaceshapedata *p_surf_shape );
/*
    Purpose: Initializes a spline surface data structure.

    Input Arguments:
        u_par_arr - A <i>ProArray</i> of U parameter grids
        v_par_arr - A <i>ProArray</i> of V parameter grids
        points_arr - A <i>ProArray</i> of interpolant points
        u_tan_arr - A <i>ProArray</i> of U derivatives at these points
        v_tan_arr - A <i>ProArray</i> of V derivatives at these points
        uvdev_arr - A <i>ProArray</i> of UV derivatives at the interpolant 
                    points
        num_u - The size in U
        num_v - The size in V

    Output Arguments:
        p_surf_shape - The spline surface

    Return Values:
        PRO_TK_NO_ERROR - The function successfully initialized the spline 
                          surface.
        PRO_TK_BAD_INPUTS - One or more of the input arguments are invalid.

*/

LIB_PTK_INTF_API  ProError ProSplinesrfdataGet ( ProSurfaceshapedata *p_surf_shape,
				      double	**p_u_par_arr,
				      double	**p_v_par_arr,
				      Pro3dPnt	**p_points_arr,
				      ProVector **p_u_tan_arr,
				      ProVector **p_v_tan_arr,
				      ProVector **p_uvdev_arr,
		 		      int	*p_num_u,
		  		      int	*p_num_v );
/*
    Purpose: Retrieves information from the spline surface data structure.
             <p> NOTE:
             <p> This function ignores the output arguments with NULL pointers.

    Input Arguments:
        p_surf_shape - The spline surface data structure

    Output Arguments:
        p_u_par_arr - The pointer to a <i>ProArray</i> of U parameter grids
        p_v_par_arr - The pointer to a <i>ProArray</i> of V parameter grids
        p_points_arr - The pointer to a <i>ProArray</i> of interpolant points
        p_u_tan_arr - The pointer to a <i>ProArray</i> of U derivatives at 
                      these points
        p_v_tan_arr - The pointer to a <i>ProArray</i> of V derivatives at 
                      these points
        p_uvdev_arr - The pointer to a <i>ProArray</i> of UV derivatives at the 
                      interpolant points
        p_num_u - The size in U
        p_num_v - The size in V

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the information.
        PRO_TK_BAD_INPUTS - The input argument is invalid.

*/

extern ProError ProCylsplsrfdataInit ( ProVector	e1,
				       ProVector	e2,
				       ProVector	e3,
				       Pro3dPnt		origin,
				       ProSplinesrfdata *p_splinesrf,
				       ProSurfaceshapedata *p_surf_shape );
/*
    Purpose: Initializes a cylindrical-spline surface data structure.

    Input Arguments:
        e1 - The X-axis of the coordinate system
        e2 - The Y-axis of the coordinate system
        e3 - The Z-axis of the coordinate system
        origin - The origin of the coordinate system
        p_splinesrf - The spline surface

    Output Arguments:
        p_surf_shape - The cylindrical-spline surface

    Return Values:
        PRO_TK_NO_ERROR - The function successfully initialized the 
                          cylindrical-spline surface.
        PRO_TK_BAD_INPUTS - One or more of the input arguments are invalid.

*/

extern ProError ProCylsplsrfdataGet ( ProSurfaceshapedata *p_surf_shape,
				      ProVector		e1,
				      ProVector		e2,
				      ProVector		e3,
				      Pro3dPnt		origin,
				      ProSplinesrfdata	*p_splinesrf );
/*
    Purpose: Retrieves information from the cylindrical-spline surface data 
             structure.
             <p> NOTE:
             <p> This function ignores the output arguments with NULL pointers.

    Input Arguments:
        p_surf_shape - The cylindrical-spline surface data structure

    Output Arguments:
        e1 - The X-axis of the coordinate system
        e2 - The Y-axis of the coordinate system
        e3 - The Z-axis of the coordinate system
        origin - The origin of the coordinate system
        p_splinesrf - The spline surface

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the information.
        PRO_TK_BAD_INPUTS - The input argument is invalid.

*/

LIB_PTK_INTF_API  ProError ProBsplinesrfdataInit ( int		deg[2],
					double		*u_par_arr,
					double		*v_par_arr,
					double		*wghts_arr,
					Pro3dPnt	*c_point_arr,
					int		num_u,
					int		num_v,
					int		num_c_point,
					ProSurfaceshapedata *p_surf_shape );
/*
    Purpose: Initializes the B-spline surface data structure.

    Input Arguments:
        deg - The basis function's degrees (in the U and V directions).
        u_par_arr - The <i>ProArray</i> of knots on the parameter line, U.
        v_par_arr - The <i>ProArray</i> of knots on the parameter line, V.
        wghts_arr - In the case of rational B-splines, this is a 
                    <i>ProArray</i> of the same dimension as the array of 
                    <i>c_point_arr</i>. Otherwise, this is NULL.
        c_point_arr - The <i>ProArray</i> of control points.
        num_u - The size in U.
        num_v - The size in V.
        num_c_point - The number of control points.

    Output Arguments:
        p_surf_shape - The B-spline surface.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully initialized the B-spline 
                          surface.
        PRO_TK_BAD_INPUTS - One or more of the input arguments are invalid.
        PRO_TK_BSPL_UNSUITABLE_DEGREE - The degree is greater than effectively 
                                        supported maximum (3).
        PRO_TK_BSPL_NON_STD_END_KNOTS - The end knots do not have <i>degree + 
                                        1</i> multiplicity.
        PRO_TK_BSPL_MULTI_INNER_KNOTS - Some of the inner knots are multiple.

*/

LIB_PTK_INTF_API  ProError ProBsplinesrfdataGet ( ProSurfaceshapedata *p_surf_shape,
				       int		deg[2],
				       double		**p_u_par_arr,
				       double		**p_v_par_arr,
				       double		**p_wghts_arr,
				       ProVector 	**p_c_point_arr,
 				       int		*p_num_u,
				       int		*p_num_v,
				       int		*p_num_c_point );
/*
    Purpose: Retrieves information from the B-spline surface data structure.
             <p> NOTE: 
             <p> This function ignores the output arguments with NULL pointers.

    Input Arguments:
        p_surf_shape - The B-spline surface data structure.

    Output Arguments:
        deg - The basis function's degrees (in the U and V directions).
        p_u_par_arr - The pointer to a <i>ProArray</i> of knots on the 
                      parameter line, U.
        p_v_par_arr - The pointer to a <i>ProArray</i> of knots on the 
                      parameter line, V.
        p_wghts_arr - In the case of rational B-splines, this is the pointer to 
                      a <i>ProArray</i> of the same dimensions as the array of 
                      <i>c_point_arr</i>. Otherwise, this is NULL.
        p_c_point_arr - The <i>ProArray</i> of control points.
        p_num_u - The size in U.
        p_num_v - The size in V.
        p_num_c_point - The number of control points.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the information.
        PRO_TK_BAD_INPUTS - The input argument is invalid.

*/

extern ProError ProFilsrfdataInit ( ProSplinedata *p_pnt_spline,
				    ProSplinedata *p_ctr_spline,
				    ProSplinedata *p_tan_spline,
				    ProSurfaceshapedata *p_surf_shape );
/*
    Purpose: Initializes a fillet surface data structure.

    Input Arguments:
        p_pnt_spline - The spline running along the U = 0 boundary
        p_ctr_spline - The spline running along the "axis"
        p_tan_spline - The spline of unit tangents along the axis

    Output Arguments:
        p_surf_shape - The fillet surface

    Return Values:
        PRO_TK_NO_ERROR - The function successfully initialized the fillet 
                          surface.
        PRO_TK_BAD_INPUTS - One or more of the input arguments are invalid.

*/

extern ProError ProFilsrfdataGet ( ProSurfaceshapedata *p_surf_shape,
				   ProSplinedata	*p_pnt_spline,
				   ProSplinedata	*p_ctr_spline,
				   ProSplinedata	*p_tan_spline );
/*
    Purpose: Retrieves information from the fillet surface data structure.
             <p> NOTES:
             <p> This function ignores the output arguments with NULL pointers.

    Input Arguments:
        p_surf_shape - The fillet surface data structure

    Output Arguments:
        p_pnt_spline - The spline running along the U = 0 boundary
        p_ctr_spline - The spline running along the "axis"
        p_tan_spline - The spline of unit tangents along the axis

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the information.
        PRO_TK_BAD_INPUTS - The input argument is invalid.

*/

PRO_END_C_DECLS

#endif /* PROSURFACEDATA_H */