#ifndef PRO_THICKEN_H
#define PRO_THICKEN_H

/*
   Creo Parametric TOOLKIT declarations related to Thicken feature.
*/



#include <ProToolkit.h>

PRO_BEGIN_C_DECLS

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

(1) Feature element tree

   PRO_E_FEATURE_TREE
      |
      |-- PRO_E_FEATURE_TYPE
      |
      |-- PRO_E_FEATURE_FORM
      |
      |-- PRO_E_FEAT_FORM_ALWAYS_THIN
      |
      |-- PRO_E_STD_USEQLT_QLT
      |
      |-- PRO_E_THICKEN_TYPE
      |
      |-- PRO_E_STD_USEQLT_SIDE
      |
      |-- PRO_E_USEQLT_SOLID_SIDE
      |
      |-- PRO_E_THICKNESS
      |
      |-- PRO_E_SRF_OFFS_METHOD
      |
      |-- PRO_E_SRF_OFFS_CTRLFIT
      |     |
      |     |-- PRO_E_SRF_OFFS_SCALINGCSYS
      |     |
      |     |-- PRO_E_SRF_OFFS_AXISES
      |
      |-- PRO_E_SRF_OFFS_HANDLINGS
      |    |
      |    |-- PRO_E_SRF_OFFS_HANDLING
      |         |
      |         |-- PRO_E_SRF_OFFS_REF_SEL
      |         |
      |         |-- PRO_E_SRF_OFFS_ACTION
      |
      |-- PRO_E_IS_SMT_CUT
      |
      |-- PRO_E_SMT_CUT_NORMAL_DIR
      |
      |-- PRO_E_STD_FEATURE_NAME


===============================================================================

(2) Feature Elements Table

-------------------------------------------------------------------------------
 Element Id                  Element Name                Data Type             
-------------------------------------------------------------------------------
 PRO_E_FEATURE_TYPE          Feature Type             PRO_VALUE_TYPE_INT       
 PRO_E_FEATURE_FORM          Feature Form             PRO_VALUE_TYPE_INT       
 PRO_E_FEAT_FORM_ALWAYS_THIN Thin Form                PRO_VALUE_TYPE_INT       
 PRO_E_STD_USEQLT_QLT        Reference Quilt          PRO_VALUE_TYPE_SELECTION 
 PRO_E_THICKEN_TYPE          Thicken type             PRO_VALUE_TYPE_INT
 PRO_E_STD_USEQLT_SIDE       Material Side            PRO_VALUE_TYPE_INT       
 PRO_E_USEQLT_SOLID_SIDE     Solid Material Side      PRO_VALUE_TYPE_INT
                                                      (See Note-6)       
 PRO_E_THICKNESS             Thickness                PRO_VALUE_TYPE_DOUBLE    
 PRO_E_SRF_OFFS_METHOD       Offset method            PRO_VALUE_TYPE_INT       
 PRO_E_SRF_OFFS_CTRLFIT      Control Fit              PRO_ELEM_COMPOUND        
 PRO_E_SRF_OFFS_SCALINGCSYS  Control Fit Csys         PRO_VALUE_TYPE_SELECTION 
 PRO_E_SRF_OFFS_AXISES       Control Fit Axes         PRO_VALUE_TYPE_INT       
 PRO_E_SRF_OFFS_HANDLINGS    Special Handlings        PRO_ELEM_ARRAY           
 PRO_E_SRF_OFFS_HANDLING     Special Handling item    PRO_ELEM_COMPOUND        
 PRO_E_SRF_OFFS_REF_SEL      Special Handling faces   PRO_VALUE_TYPE_SELECTION 
 PRO_E_SRF_OFFS_ACTION       Special Handling action  PRO_VALUE_TYPE_INT 
 PRO_E_IS_SMT_CUT            Is Smt Cut               PRO_VALUE_TYPE_INT 
 PRO_E_SMT_CUT_NORMAL_DIR    Normal Direction         PRO_VALUE_TYPE_INT
 PRO_E_STD_FEATURE_NAME      Feature Name             PRO_VALUE_TYPE_WSTRING   
===============================================================================

(3) Element Values Table

-------------------------------------------------------------------------------
 Element Id                  Element Name         Valid Values                 
-------------------------------------------------------------------------------
 PRO_E_FEATURE_TYPE          Feature Type         PRO_FEAT_PROTRUSION 
                                                   or PRO_FEAT_CUT
 PRO_E_FEATURE_FORM          Feature Form         PRO_USE_SURFS
 PRO_E_FEAT_FORM_ALWAYS_THIN Thin Form            PRO_THIN (See Note-1)
 PRO_E_STD_USEQLT_QLT        Reference Quilt      PRO_QUILT  
 PRO_E_THICKEN_TYPE          Thicken type         See Note-2
 PRO_E_STD_USEQLT_SIDE       Material Side        ProThickenSideOption
 PRO_E_USEQLT_SOLID_SIDE     Solid Material Side  See Note-6       
 PRO_E_SRF_OFFS_METHOD       Offset method        ProThickenOffMethodOpts
 PRO_E_SRF_OFFS_SCALINGCSYS  Control Fit Csys     PRO_CSYS  
 PRO_E_SRF_OFFS_AXISES       Control Fit Axes     ProThickenAxesOption
 PRO_E_SRF_OFFS_REF_SEL      Spl Handling faces   PRO_SURFACE (See Note-3)
 PRO_E_SRF_OFFS_ACTION       Spl Handling action  ProThickenHandlingAction
 PRO_E_IS_SMT_CUT            Is Smt Cut           See Note-7
 PRO_E_SMT_CUT_NORMAL_DIR    Normal Direction     See Note-8
 PRO_E_STD_FEATURE_NAME      Feature Name         See Note-4
===============================================================================

(4) Mapping Table

-------------------------------------------------------------------------------
 Variation                         Element Name                Comment
-------------------------------------------------------------------------------
 All types                         PRO_E_FEATURE_TYPE          Mandatory
                                   PRO_E_FEATURE_FORM          Mandatory
                                   PRO_E_FEAT_FORM_ALWAYS_THIN Mandatory
                                   PRO_E_STD_USEQLT_QLT        Mandatory
                                   PRO_E_THICKEN_TYPE          Optional(Note-2)
                                   PRO_E_STD_USEQLT_SIDE       Optional
                                   PRO_E_USEQLT_SOLID_SIDE     Optional(Note-6)
                                   PRO_E_THICKNESS             Mandatory
                                   PRO_E_SRF_OFFS_METHOD       Optional(Note-5)
                                   PRO_E_IS_SMT_CUT            Optional(Note-7)
                                   PRO_E_SMT_CUT_NORMAL_DIR    Optional(Note-8)
                                   PRO_E_STD_FEATURE_NAME      Optional(Note-4)
...............................................................................
Offset method is                   PRO_E_SRF_OFFS_HANDLINGS    N/A
PRO_OFFS_METH_NORMTOSURF           PRO_E_SRF_OFFS_HANDLING     N/A
                                   PRO_E_SRF_OFFS_REF_SEL      Optional
				   PRO_E_SRF_OFFS_ACTION       Optional
...............................................................................
Offset method is                   None
PRO_OFFS_METH_AUTOSCALE
...............................................................................
Offset method is                   PRO_E_SRF_OFFS_CTRLFIT      N/A
PRO_OFFS_METH_MANUALSCALE          PRO_E_SRF_OFFS_SCALINGCSYS  Mandatory
                                   PRO_E_SRF_OFFS_AXISES       Optional
===============================================================================
(5) Notes

   Note-1 : This is a non-redefinable mandatory element for Thicken.
            Its only valid value is PRO_THIN.
            The element should be set after PRO_E_FEATURE_FORM.

   Note-2 : This element is optional. If present this element should
            have same value as PRO_E_FEATURE_TYPE except the case
            of PRO_FEAT_CUT_SMT. For PRO_FEAT_CUT_SMT this element
            has the value PRO_FEAT_CUT and the element
            PRO_E_IS_SMT_CUT has the value PRO_B_TRUE.

   Note-3 : Surfaces should be from Reference Quilt

   Note-4 : Thicken feature name.
            Default value is:
              "PROTRUSION" if PRO_E_FEATURE_TYPE is PRO_FEAT_PROTRUSION
              "CUT"        if PRO_E_FEATURE_TYPE is PRO_FEAT_CUT

   Note-5 : Default Offset method is PRO_OFFS_METH_NORMTOSURF

   Note-6 : PRO_E_USEQLT_SOLID_SIDE will always be invisible for Thicken.
            Its value will always be ignored.
   
   Note-7 : This element is applicable only in sheetmetal parts.
            Controls cut type, SMT or SOLID.
            PRO_B_TRUE for SMT cut type.

   Note-8 : This element is applicable only in sheetmetal parts.
            SMT Cut geometry driving surface.
            This element can be PRO_SMT_CUT_DRVSIDE_GREEN for normal to
            Driven Surface or PRO_SMT_CUT_DRVSIDE_WHITE for normal to
            Offset Surface.
            ProSmtCutNormDir.

==============================================================================*/
/*
(6) Enum Declarations
*/

/* ========================= */
/* Side options of Thicken : */
/* ========================= */

typedef enum _ProThickenSideOption
{
 PRO_THICKEN_SIDE_ONE     = -1,
 PRO_THICKEN_BOTH_SIDES   = 0,
 PRO_THICKEN_SIDE_TWO     = 1
} ProThickenSideOption;


/* =========================== */
/* Offset Method for Thicken : */
/* =========================== */

typedef enum _ProThickenOffMethodOpts
{
   PRO_OFFS_METH_NORMTOSURF  = 1,
   PRO_OFFS_METH_AUTOSCALE   = 2,
   PRO_OFFS_METH_MANUALSCALE = 3
} ProThickenOffMethodOpts;

typedef enum _ProThickenAxesOption
{
    PRO_OFFS_TRF_NONE = 0,
    PRO_OFFS_TRF_X    = 1,
    PRO_OFFS_TRF_Y    = 2,
    PRO_OFFS_TRF_Z    = 4,
    PRO_OFFS_TRF_XY   = 3,
    PRO_OFFS_TRF_YZ   = 6,
    PRO_OFFS_TRF_ZX   = 5,
    PRO_OFFS_TRF_ALL  = 7
} ProThickenAxesOption;

typedef enum _ProThickenHandlingAction
{
    PRO_OFFS_ACTION_LEAVE  = -1,
    PRO_OFFS_ACTION_APPROX = 1
} ProThickenHandlingAction;

PRO_END_C_DECLS
#endif /* PRO_THICKEN_H */