/*
 
uf_sket_types.h
File Description:

Open C API s for the sketch module.

*******************************************************************************/


#ifndef UF_SKET_TYPES_INCLUDED
#define UF_SKET_TYPES_INCLUDED

#include <uf_defs.h>
#include <uf_obj_types.h>




   /* output_mode used by UF_SKET_add_extracted_objects */
#define UF_SKET_EXTR_ORIG_TYPE         (0)
#define UF_SKET_EXTR_MULTI_SPLINES     (1)
#define UF_SKET_EXTR_SINGLE_SPLINE     (2)

   /* ref_info used by UF_SKET_attach_to_face  */
#define UF_SKET_HORIZONTAL        (1)
#define UF_SKET_VERTICAL          (2)
#define UF_SKET_WITH_NORMAL       (1)
#define UF_SKET_OPPOSITE_NORMAL   (2)
#define UF_SKET_ALONG_CURVE       (1)
#define UF_SKET_OPPOSITE_CURVE    (-1)

   /* geometric constraint type used by UF_SKET_delete_legacy_constraint */
#define UF_SKET_DATUM                   (10)
#define UF_SKET_CONSTANT_OFFSETS        (11)
#define UF_SKET_POINT_ON_CURVE          (12)
#define UF_SKET_MIDPOINT_OF_CURVE       (13)
#define UF_SKET_HORIZONTAL_LINES        (14)
#define UF_SKET_VERTICAL_LINES          (15)
#define UF_SKET_CONSTANT_ANGLES         (16)
#define UF_SKET_CONSTANT_LENGTH_LINES   (17)
#define UF_SKET_COLLINEAR               (18)
#define UF_SKET_PARALLEL                (19)
#define UF_SKET_PERPENDICULAR           (20)
#define UF_SKET_EQUAL_LENGTH            (21)
#define UF_SKET_EQUAL_RADIUS            (22)
#define UF_SKET_TANGENT_CURVES          (23)



/*
 Sketch Status definitions
*/


/*
   As of V17, the values of these UF_SKET_status_e will be recorded in
   the part file.  Hence, their values cannot be arbitrarily changed.
*/


enum UF_SKET_status_e
{
   UF_SKET_unknown_status,
   UF_SKET_not_evaluated,
   UF_SKET_under_constrained,
   UF_SKET_well_constrained,
   UF_SKET_over_constrained,
   UF_SKET_inconsistently_constrained
} ;
typedef enum UF_SKET_status_e UF_SKET_status_t, *UF_SKET_status_p_t;

enum UF_SKET_reference_status_e
{
   UF_SKET_reference,
   UF_SKET_active
};
typedef enum UF_SKET_reference_status_e UF_SKET_reference_status_t;

enum UF_SKET_con_type_e
{
   UF_SKET_no_con,
   UF_SKET_fixed,
   UF_SKET_horizontal,
   UF_SKET_vertical,
   UF_SKET_parallel,
   UF_SKET_perpendicular,
   UF_SKET_collinear,
   UF_SKET_equal_length,
   UF_SKET_equal_radius,
   UF_SKET_constant_length,
   UF_SKET_constant_angle,
   UF_SKET_coincident,
   UF_SKET_concentric,
   UF_SKET_mirror,
   UF_SKET_point_on_curve,
   UF_SKET_midpoint,
   UF_SKET_tangent,
   UF_SKET_radius_dim,
   UF_SKET_diameter_dim,
   UF_SKET_horizontal_dim,
   UF_SKET_vertical_dim,
   UF_SKET_parallel_dim,
   UF_SKET_perpendicular_dim,
   UF_SKET_angular_dim,
   UF_SKET_reserved_con_1,             /* Do not use */
   UF_SKET_reserved_con_2,             /* Do not use */
   UF_SKET_reserved_con_3,             /* Do not use */
   UF_SKET_reserved_con_4,             /* Do not use */
   UF_SKET_reserved_con_5,             /* Do not use */
   UF_SKET_reserved_con_6,             /* Do not use */
   UF_SKET_point_on_string,
   UF_SKET_slope,
   UF_SKET_uniform_scaled,
   UF_SKET_non_uniform_scaled ,
   UF_SKET_assoc_trim,                 /* Limited support */
   UF_SKET_assoc_offset,               /* Limited support */
   UF_SKET_perimeter_dim,
   UF_SKET_pgm_offset,
   UF_SKET_normal,
   UF_SKET_point_on_loop,
   UF_SKET_recipe_trim,
   UF_SKET_pattern,
   UF_SKET_rigid_set,
   UF_SKET_g1,
   UF_SKET_g2,
   UF_SKET_last_con_type /* The last constraint type indicator; NOT to be used. */
};

typedef enum UF_SKET_con_type_e UF_SKET_con_type_t, *UF_SKET_con_type_p_t;

#define UF_SKET_MAX_CON_TYPES 51

#define UF_SKET_MAX_GEOMETRY_PER_CON 4

enum UF_SKET_con_class_e
{
   UF_SKET_no_cons,
   UF_SKET_all_cons,
   UF_SKET_geo_cons,
   UF_SKET_dim_cons

};
typedef enum UF_SKET_con_class_e UF_SKET_con_class_t, *UF_SKET_con_class_p_t;


struct UF_SKET_info_s
{
int    subtype;          /* UF_v9_sketch_subtype, UF_v13_sketch_subtype or
                           UF_extracted_sketch_subtype
                        */

char   name[ UF_OBJ_NAME_BUFSIZE ];    /* sketch's name  */
tag_t  csys_tag;         /* sketch's CSYS tag          */
double csys[12];         /* sketch's CSYS :
                           sketch_csys[0-8] : the orientation,
                           sketch_csys[9-11]: the origin
                        */

char   view_name[16];    /* sketch's view name (for pre-V13 sketches only) */
tag_t  datum_tag;        /* sketch's datum tag (for pre-V13 sketches only) */
double datum[3];         /* sketch's datum (for pre-V13 sketches only)     */

} ;

typedef struct UF_SKET_info_s UF_SKET_info_t, *UF_SKET_info_p_t;
/******************************************************************************
 enum and structures for creating dimensions
******************************************************************************/


/*

*/


/*
  Associativity types for sketch dimension.
*/

enum UF_SKET_assoc_type_e{
   UF_SKET_assoc_type_none,
       UF_SKET_end_point,
       UF_SKET_arc_center,
       UF_SKET_tangency,
       UF_SKET_curve_point,
   UF_SKET_anchor_point
} ;

typedef enum UF_SKET_assoc_type_e UF_SKET_assoc_type_t;

enum UF_SKET_assoc_mod_e{
       UF_SKET_first_end_point,
       UF_SKET_last_end_point
} ;

typedef enum UF_SKET_assoc_mod_e UF_SKET_assoc_mod_t;

struct UF_SKET_dim_object_s
{
tag_t object_tag;            /* Tag of the object - sketch curves, edge,
                               datum plane, datum axis, NX curves */


UF_SKET_assoc_type_t object_assoc_type;    /* Object associativity type:
                                             UF_SKET_end_point;
                                             UF_SKET_arc_center -
                                                object must be an arc;
                                             UF_SKET_tangency -
                                                object must be an arc;
                         UF_SKET_curve_point -
                        object must be a spline
                         UF_SKET_anchor_point -
                        object must be a sketch conic */


int object_assoc_mod_value;   /* Object associativity modifier:
                               UF_SKET_first_end_point or UF_SKET_last_end_point
                   if object_assoc_type = UF_SKET_end_point;
               Not Used
                   if object_assoc_type = UF_SKET_arc_center or
                   UF_SKET_anchor_point;
               parameter percentage (0 - 100) (used to find approx tgt pt)
                   if object_assoc_type = UF_SKET_tangency;
               the index number of the defining point of the spline(starting from 1)
                   if object_assoc_type = UF_SKET_curve_point;
                 */


} ;

typedef struct UF_SKET_dim_object_s UF_SKET_dim_object_t, *UF_SKET_dim_object_p_t;

/******************************************************************************
 enum and structures for createing geometric constraints
******************************************************************************/


enum UF_SKET_geom_vertex_e
{
   UF_SKET_no_vertex,
   UF_SKET_start_vertex,
   UF_SKET_end_vertex,
   UF_SKET_center_vertex,          /* used only for Arcs/Ellipses */
   UF_SKET_spline_defining_point,  /* used only for splines       */
   UF_SKET_anchor_vertex,          /* used only by general conics */
   UF_SKET_spline_pole
} ;

typedef enum UF_SKET_geom_vertex_e UF_SKET_geom_vertex_t;

enum UF_SKET_help_type_e
{
   UF_SKET_no_help_data,
   UF_SKET_use_help_pt,
   UF_SKET_use_help_param
};

typedef enum UF_SKET_help_type_e UF_SKET_help_type_t;

struct UF_SKET_con_geom_s
{
tag_t                  geom_tag;       /* The geomtry's tag */
UF_SKET_geom_vertex_t  vertex_type;    /* Vertex type if it is the vertex
                                         of the geometry that will be
                                         constrained.
                                         Valid types are specified in
                                         UF_SKET_geom_vertex_t.
                                      */

int                    vertex_index;   /* Starting from 1. Used to
                                         indicate which defining point
                                         of the spline will be constrained.
                                         Only used when vertex_type is
                                         UF_SKET_spline_defining_point.
                                      */

UF_SKET_help_type_t    use_help;       /* Whether to use help data (either
                                         help points or help parameter.)
                                         Valid types as specified in
                                         UF_SKET_help_type_t.  Help
                                         points/parameters are used to
                                         indicate whereabouts on the geometry
                                         a constraint should apply to. They
                                         are only needed when the constraints
                                         are of type UF_SKET_tangent,
                                         UF_SKET_point_on_curve, or
                                         UF_SKET_point_on_string.
                                       */

double                 help_point[3];  /* Help point */

double                 help_parameter; /* Help parameter */

};

typedef struct UF_SKET_con_geom_s UF_SKET_con_geom_t, *UF_SKET_con_geom_p_t;



#endif  /* UF_SKET_TYPES_INCLUDED */