/*
 
uf_modl_mswp_types.h
ÎļþÃèÊö:

   Sweep (MSWP) data structures and types

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


#ifndef UF_MODL_MSWP_TYPES_H_INCLUDED
#define UF_MODL_MSWP_TYPES_H_INCLUDED

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

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

#include <uf_modl_types.h>



/* Data definitions for limits including trimming */

enum UF_MODL_mswp_limit_type_t
{  
   UF_MODL_MSWP_LIMIT_DISTANCE = 0,      /* DISTANCE limit */
   UF_MODL_MSWP_LIMIT_UNTIL_NEXT,        /* UNITIL_NEXT limit */
   UF_MODL_MSWP_LIMIT_UNTIL_SELECTED,    /* UNTIL_SELECTED limit */
   UF_MODL_MSWP_LIMIT_THRU_ALL           /* THRU_ALL limit */
};

/* Single expression data that can be used by distance, angle, etc. */
struct UF_MODL_mswp_string_data_s
{
   char   string[UF_MAX_EXP_LENGTH];
   tag_t  expression_tag;
};
typedef struct UF_MODL_mswp_string_data_s
              UF_MODL_mswp_string_data_t, *UF_MODL_mswp_string_data_p_t;

struct UF_MODL_mswp_until_selected_data_s
{
   tag_t   selected_object;
};
typedef struct UF_MODL_mswp_until_selected_data_s
              UF_MODL_mswp_until_selected_data_t, *UF_MODL_mswp_until_selected_data_p_t;

union UF_MODL_mswp_limit_data_u
{
   UF_MODL_mswp_string_data_t         distance_data;
   UF_MODL_mswp_until_selected_data_t until_selected_data;
};
typedef union UF_MODL_mswp_limit_data_u
             UF_MODL_mswp_limit_data_t, *UF_MODL_mswp_limit_data_p_t;

struct UF_MODL_mswp_limit_s
{
   UF_MODL_mswp_limit_type_t  limit_type;
   UF_MODL_mswp_limit_data_t  limit_data;
   logical surf_extend;                            /* For until selected & face only */
};
typedef struct UF_MODL_mswp_limit_s
              UF_MODL_mswp_limit_t, *UF_MODL_mswp_limit_p_t;

struct UF_MODL_mswp_limits_s
{
   logical                       symmetry;         /* True: end_limit will not be used
                                                      and the limit type is DISTANCE only;
                                                      False: both limits will be used
                                                      and the limit can be of any type. */

   UF_MODL_mswp_limit_t  start_limit;
   UF_MODL_mswp_limit_t  end_limit;
};
typedef struct UF_MODL_mswp_limits_s
              UF_MODL_mswp_limits_t, *UF_MODL_mswp_limits_p_t;

/* Offset data definitions */
enum UF_MODL_mswp_offset_type_e
{  
   UF_MODL_MSWP_OFFSET_NONE = 0,         /* No offset */
   UF_MODL_MSWP_OFFSET_NORMAL,           /* Offset with two different distances */
   UF_MODL_MSWP_OFFSET_SYMMETRY,         /* Offset with same distance in both directions */
   UF_MODL_MSWP_OFFSET_SINGLE            /* Offset with single distance in one direction */
};
typedef enum UF_MODL_mswp_offset_type_e
            UF_MODL_mswp_offset_type_t;

struct UF_MODL_mswp_offsets_s
{
   UF_MODL_mswp_offset_type_t           type;
   UF_MODL_mswp_string_data_t           start_offset;
   UF_MODL_mswp_string_data_t           end_offset;
};
typedef struct UF_MODL_mswp_offsets_s
              UF_MODL_mswp_offsets_t, *UF_MODL_mswp_offsets_p_t;

/* Taper data definitions */
enum UF_MODL_mswp_taper_type_e
{  
   UF_MODL_MSWP_TAPER_NONE = 0,         /* No taper */
   UF_MODL_MSWP_TAPER_FROM_EDGE,        /* Simple taper from start edges */
   UF_MODL_MSWP_TAPER_FROM_PROFILE,     /* Simple taper from section */
   UF_MODL_MSWP_TAPER_SYMMETRY,         /* Symmetric taper from section */
   UF_MODL_MSWP_TAPER_MATCHED,           /* Matched end taper from section */
   UF_MODL_MSWP_TAPER_ASYMMETRIC       /* Asymmetric taper from section */
};
typedef enum UF_MODL_mswp_taper_type_e
            UF_MODL_mswp_taper_type_t;

struct UF_MODL_mswp_taper_chain_s
{
   UF_MODL_mswp_string_data_t         angle;
   UF_MODL_mswp_string_data_t         back_angle;
   int                                num_curves;    /* Number of curves in a tangent chain.  This can be determined by section only. */
   tag_t                             *curves;        /* Output curves of a tangent chain in a section */
};
typedef struct UF_MODL_mswp_taper_chain_s
              UF_MODL_mswp_taper_chain_t, *UF_MODL_mswp_taper_chain_p_t;

struct UF_MODL_mswp_multi_taper_s
{
   int                                num_chains;    /* Number of tangent chains for the section.  This can't be determined by the user. */
   UF_MODL_mswp_taper_chain_t        *chains;       /* Each chain contains a set of curve tags and an angle */
};
typedef struct UF_MODL_mswp_multi_taper_s
              UF_MODL_mswp_multi_taper_t, *UF_MODL_mswp_multi_taper_p_t;

struct UF_MODL_mswp_taper_s
{
   UF_MODL_mswp_taper_type_t          type;
   UF_MODL_mswp_string_data_t         angle;         /* angle for simple taper */
   UF_MODL_mswp_string_data_t         back_angle;    /* back angle for simple taper */
   UF_MODL_mswp_multi_taper_t         multi_taper;   /* multi-taper  */
};
typedef struct UF_MODL_mswp_taper_s
              UF_MODL_mswp_taper_t, *UF_MODL_mswp_taper_p_t;

/* The main data structure for Extrude */
struct UF_MODL_mswp_extrude_s
{
   tag_t                          section;
   tag_t                          direction;
   double                         dist_tol;
   double                         chain_tol;
   double                         planar_tol;
   double                         angle_tol;
   UF_MODL_mswp_limits_t          limits;
   UF_MODL_mswp_offsets_t         offsets;
   UF_MODL_mswp_taper_t           taper;
   UF_FEATURE_SIGN                sign;
   tag_t                          target_body;
   int                            heal_geom; /* 0 = no action
                                                1 = fix the geometry defects of input curves
                                                if within tolerance, including gap/overlay
                                                between curves and off-planar condition for capping. */

   logical                        solid_preferred;
};
typedef struct UF_MODL_mswp_extrude_s
              UF_MODL_mswp_extrude_t, *UF_MODL_mswp_extrude_p_t;



#endif /* UF_MODL_MSWP_TYPES_H_INCLUDED */