#ifndef PROASMCOMP_H
#define PROASMCOMP_H

/* Creo Parametric TOOLKIT declarations for ProAsmcomp objects */

#include <ProObjects.h>
#include <ProMdl.h>




PRO_BEGIN_C_DECLS

/*****************************************************************************\

Feature element tree

   PRO_E_FEATURE_TREE
     |
     |--PRO_E_FEATURE_TYPE
     |
     |--PRO_E_COMPONENT_MODEL
     |
     |--PRO_E_COMPONENT_MISC_ATTR
     |
     |--PRO_E_COMPONENT_INIT_POS
     |
     |--PRO_E_COMP_PLACE_INTERFACE
     |    |--PRO_E_COMP_PLACE_INTERFACE_TYPE
     |    |--PRO_E_COMP_PLACE_INTERFACE_COMP
     |    |--PRO_E_COMP_PLACE_INTERFACE_ASSEMS
     |         |--PRO_E_COMP_PLACE_INTERFACE_ASSEM
     !             |--PRO_E_COMP_PLACE_INTERFACE_ASSEM_REF
     |
     |--PRO_E_COMPONENT_SETS
     |    |--PRO_E_COMPONENT_SET
     |         |--PRO_E_COMPONENT_SET_ID
     |         |--PRO_E_COMPONENT_SET_TYPE
     |         |--PRO_E_COMPONENT_SET_NAME
     |         |--PRO_E_COMPONENT_SET_MISC_ATTR
     |         |--PRO_E_COMPONENT_SET_FLIP
     |         |--PRO_E_COMPONENT_JAS_SETS
     |              |--PRO_E_COMPONENT_JAS_SET
     |                   |--PRO_E_COMPONENT_JAS_ZERO_TYPE
     |                   |--PRO_E_COMPONENT_JAS_REFS
     |                   |    |--PRO_E_COMPONENT_JAS_ORANGE_REF
     |                   |    |--PRO_E_COMPONENT_JAS_GREEN_REF
     |                   |    |--PRO_E_COMPONENT_JAS_0_OFFSET_VAL
     |                   |--PRO_E_COMPONENT_JAS_REGEN_VALUE_GROUP
     |                   |    |--PRO_E_COMPONENT_JAS_REGEN_VALUE_FLAG
     |                   |    |--PRO_E_COMPONENT_JAS_REGEN_VALUE
     |                   |--PRO_E_COMPONENT_JAS_MIN_LIMIT
     |                   |    |--PRO_E_COMPONENT_JAS_MIN_LIMIT_FLAG
     |                   |    |--PRO_E_COMPONENT_JAS_MIN_LIMIT_VAL
     |                   |    |--PRO_E_COMPONENT_JAS_MIN_LIMIT_REF
     |                   |--PRO_E_COMPONENT_JAS_MAX_LIMIT
     |                   |    |--PRO_E_COMPONENT_JAS_MAX_LIMIT_FLAG
     |                   |    |--PRO_E_COMPONENT_JAS_MAX_LIMIT_VAL
     |                   |    |--PRO_E_COMPONENT_JAS_MAX_LIMIT_REF
     |                   |--PRO_E_COMPONENT_JAS_RESTITUTION
     |                   |    |--PRO_E_COMPONENT_JAS_RESTITUTION_FLAG
     |                   |    |--PRO_E_COMPONENT_JAS_RESTITUTION_COEF
     |                   |--PRO_E_COMPONENT_JAS_FRICTION
     |                   |    |--PRO_E_COMPONENT_JAS_FRICTION_FLAG
     |                   |    |--PRO_E_COMPONENT_JAS_STATIC_FRIC_COEF
     |                   |    |--PRO_E_COMPONENT_JAS_KINEM_FRIC_COEF
     |                   |    |--PRO_E_COMPONENT_JAS_RADIUS_VALUE
     |                   |--PRO_E_COMPONENT_JAS_CONE_FLIP
     |--PRO_E_COMPONENT_CONSTRAINTS       Array of PRO_E_COMPONENT_CONSTRAINT
     |    |--PRO_E_COMPONENT_CONSTRAINT
     |         |--PRO_E_COMPONENT_CONSTR_TYPE
     |         |--PRO_E_COMPONENT_COMP_CONSTR_REF
     |         |--PRO_E_COMPONENT_ASSEM_CONSTR_REF
     |         |--PRO_E_COMPONENT_CONSTR_REF_OFFSET (Mate/align offset)
     |         |--PRO_E_COMPONENT_USER_DATA
     |         |--PRO_E_COMPONENT_CONSTR_ATTR
     |         |--PRO_E_COMPONENT_COMP_ORIENT
     |         |--PRO_E_COMPONENT_ASSM_ORIENT
     |         |--PRO_E_COMPONENT_CONSTR_SET_ID
     |         |--PRO_E_COMPONENT_SLOT_EXTRA_CRV_REF
     |--PRO_E_COMPONENT_MOVEMENTS
          |--PRO_E_COMPONENT_MOVEMENT
               |--PRO_E_COMPONENT_MOVEMENT_TYPE
               |--PRO_E_COMPONENT_MOVEMENT_REF
               |--PRO_E_COMPONENT_MOVEMENT_VALUE



3. Feature elements table

-------------------------------------------------------------------------------------------------
Element Id                            Element Name   Data Type                Valid Values
-------------------------------------------------------------------------------------------------
PRO_E_FEATURE_TYPE                    Feature Type   PRO_VALUE_TYPE_INT       PRO_FEAT_COMPONENT
PRO_E_COMPONENT_MODEL                 Component      PRO_VALUE_TYPE_POINTER   ProSolid
PRO_E_COMP_PLACE_INTERFACE            Interface      Compound
PRO_E_COMP_PLACE_INTERFACE_TYPE       Type           PRO_VALUE_TYPE_INT       See IntfcPlaceType
PRO_E_COMP_PLACE_INTERFACE_COMP       Comp Intfc     PRO_VALUE_TYPE_SELECTION
PRO_E_COMP_PLACE_INTERFACE_ASSEMS     Asm  Intfcs    Array
PRO_E_COMP_PLACE_INTERFACE_ASSEM      Asm Intfc      compound
PRO_E_COMP_PLACE_INTERFACE_ASSEM_REF  Asm Intfc      PRO_VALUE_TYPE_SELECTION
PRO_E_COMPONENT_SETS                  Sets           Array
PRO_E_COMPONENT_SET                   Set            Compound
PRO_E_COMPONENT_SET_ID                Set Id         PRO_VALUE_TYPE_INT       Any
PRO_E_COMPONENT_SET_TYPE              Type           PRO_VALUE_TYPE_INT       See ProAsmcompSetType
PRO_E_COMPONENT_SET_NAME              Name           PRO_VALUE_TYPE_WSTRING
PRO_E_COMPONENT_SET_MISC_ATTR         Set Attr       PRO_VALUE_TYPE_INT       See PmConnectionAttr
PRO_E_COMPONENT_SET_FLIP              Set Flip       PRO_VALUE_TYPE_BOOLEAN   PRO_B_TRUE/PRO_B_FALSE
PRO_E_COMPONENT_JAS_SETS              JAS Sets       Array

PRO_E_COMPONENT_JAS_SET               Joint Axis Set Compound
PRO_E_COMPONENT_JAS_ZERO_TYPE         Zero Type      PRO_VALUE_TYPE_INT       Values of ProAxiszerotype
PRO_E_COMPONENT_JAS_REFS              JAS Refs       Compound
PRO_E_COMPONENT_JAS_ORANGE_REF        JAS Orange Ref PRO_VALUE_TYPE_SELECTION Component side selection
PRO_E_COMPONENT_JAS_GREEN_REF         JAS Green Ref  PRO_VALUE_TYPE_SELECTION Assembly side selection
PRO_E_COMPONENT_JAS_0_OFFSET_VAL      JAS 0 offset   PRO_VALUE_TYPE_DOUBLE    Any
PRO_E_COMPONENT_JAS_REGEN_VALUE_GROUP JAS Regen      Compound
PRO_E_COMPONENT_JAS_REGEN_VALUE_FLAG  JAS Reg Flag   PRO_VALUE_TYPE_BOOLEAN   PRO_B_TRUE/PRO_B_FALSE
PRO_E_COMPONENT_JAS_REGEN_VALUE       JAS Regen Val  PRO_VALUE_TYPE_DOUBLE    Between Min Limit Val and Max Limit Val
PRO_E_COMPONENT_JAS_LIMITS            JAS Limits     Compound
PRO_E_COMPONENT_JAS_MIN_LIMIT         JAS Min Limit  Compound
PRO_E_COMPONENT_JAS_MIN_LIMIT_FLAG    Min Lim Flag   PRO_VALUE_TYPE_BOOLEAN   PRO_B_TRUE/PRO_B_FALSE
PRO_E_COMPONENT_JAS_MIN_LIMIT_VAL     Min Limit Val  PRO_VALUE_TYPE_DOUBLE    (-360,360] or Any (Note 2)
PRO_E_COMPONENT_JAS_MIN_LIMIT_REF     Min Limit Ref  PRO_VALUE_TYPE_SELECTION 
PRO_E_COMPONENT_JAS_MAX_LIMIT         JAS Max Limit  Compound
PRO_E_COMPONENT_JAS_MAX_LIMIT_FLAG    Max Lim Flag   PRO_VALUE_TYPE_BOOLEAN   PRO_B_TRUE/PRO_B_FALSE
PRO_E_COMPONENT_JAS_MAX_LIMIT_VAL     Max Limit Val  PRO_VALUE_TYPE_DOUBLE    (-360,360] or Any (Note 2)
PRO_E_COMPONENT_JAS_MAX_LIMIT_REF     Max Limit Ref  PRO_VALUE_TYPE_SELECTION
PRO_E_COMPONENT_JAS_RESTITUTION       Restitution    Compound
PRO_E_COMPONENT_JAS_RESTITUTION_FLAG  Rest Flag      PRO_VALUE_TYPE_BOOLEAN   PRO_B_TRUE/PRO_B_FALSE
PRO_E_COMPONENT_JAS_RESTITUTION_COEF  Rest Coef      PRO_VALUE_TYPE_DOUBLE    [0., 1.]
PRO_E_COMPONENT_JAS_FRICTION          JAS Friction   Compound
PRO_E_COMPONENT_JAS_FRICTION_FLAG JAS Fric Flag      PRO_VALUE_TYPE_BOOLEAN   PRO_B_TRUE/PRO_B_FALSE
PRO_E_COMPONENT_JAS_STATIC_FRIC_COEF  JAS MuS        PRO_VALUE_TYPE_DOUBLE    [0., 1.]
PRO_E_COMPONENT_JAS_KINEM_FRIC_COEF   JAS MuK        PRO_VALUE_TYPE_DOUBLE    [0., 1.]
PRO_E_COMPONENT_JAS_RADIUS_VALUE      Radius Value   PRO_VALUE_TYPE_DOUBLE    Any non-negative value.
PRO_E_COMPONENT_JAS_CONE_FLIP         Cone flip      PRO_VALUE_TYPE_BOOLEAN   PRO_B_TRUE/PRO_B_FALSE

PRO_E_COMPONENT_CONSTRAINTS           Constraints    Array
PRO_E_COMPONENT_CONSTRAINT            Constraint     Compound
PRO_E_COMPONENT_CONSTR_TYPE           Type           PRO_VALUE_TYPE_INT       See ProAsmcompConstrType
PRO_E_COMPONENT_COMP_CONSTR_REF       Comp Ref       PRO_VALUE_TYPE_SELECTION See Note 1
PRO_E_COMPONENT_ASSEM_CONSTR_REF      Assem Ref      PRO_VALUE_TYPE_SELECTION See Note 1
PRO_E_COMPONENT_CONSTR_REF_OFFSET     Offset         PRO_VALUE_TYPE_DOUBLE    Any
PRO_E_COMPONENT_CONSTR_ATTR           Constr Attr    PRO_VALUE_TYPE_INT       See Note 2
PRO_E_COMPONENT_ASSM_ORIENT           Assem Orient   PRO_VALUE_TYPE_INT       See Note 3
PRO_E_COMPONENT_COMP_ORIENT           Comp Orient    PRO_VALUE_TYPE_INT       See Note 3
PRO_E_COMPONENT_CONSTR_SET_ID      Constr Set Index  PRO_VALUE_TYPE_INT       Index to set constraint belongs to
PRO_E_COMPONENT_MISC_ATTR             Comp Attr      PRO_VALUE_TYPE_INT       See Note 5 
PRO_E_COMPONENT_USER_DATA             usr dat        PRO_VALUE_TYPE_WSTRING
PRO_E_COMPONENT_INIT_POS              Init Pos       PRO_VALUE_TYPE_TRANSFORM
PRO_E_COMPONENT_SLOT_EXTRA_CRV_REF    Crv Ref        PRO_VALUE_TYPE_SELECTION Edge, Curve multi value.

PRO_E_COMPONENT_MOVEMENTS             Movements      Array
PRO_E_COMPONENT_MOVEMENT              Movement       Compound
PRO_E_COMPONENT_MOVEMENT_TYPE         Type           PRO_VALUE_TYPE_INT       see ProAsmcompMoveType
PRO_E_COMPONENT_MOVEMENT_REF          Move Ref       PRO_VALUE_TYPE_SELECTION Csys
PRO_E_COMPONENT_MOVEMENT_VALUE        Value          PRO_VALUE_TYPE_DOUBLE    Any
--------------------------------------------------------------------------------------------



   Note 1.   Constraint reference types:

   Constraint Type     Valid Reference Types
   ---------------------------------------------------------------------
   PRO_ASM_MATE          PRO_SURFACE (Plane, Cone, Torus, Cylinder)
   PRO_ASM_MATE_OFF      PRO_SURFACE (Plane)
   PRO_ASM_ALIGN         PRO_POINT, PRO_AXIS, PRO_SURFACE (Plane)
   PRO_ASM_ALIGN_OFF     PRO_POINT, PRO_AXIS, PRO_SURFACE (Plane)
   PRO_ASM_INSERT        PRO_SURFACE (Cylinder, Cone, Torus)
   PRO_ASM_ORIENT        PRO_SURFACE (Plane), PRO_CSYS
   PRO_ASM_CSYS          PRO_CSYS
   PRO_ASM_TANGENT       PRO_SURFACE (Cylinder)
   PRO_ASM_PNT_ON_LINE   PRO_POINT, PRO_EDGE, PRO_AXIS
   PRO_ASM_PNT_ON_SRF    PRO_POINT, PRO_SURFACE (Plane)
   PRO_ASM_EDGE_ON_SRF   PRO_EDGE, PRO_SURFACE (Plane)
   PRO_ASM_DEF_PLACEMENT No successor will be provided.
   PRO_ASM_SUBSTITUTE    (READ ONLY -> assembly ref is PRO_PART).
   PRO_ASM_ALIGN_ANG_OFF PRO_SURFACE (plane)
   PRO_ASM_MATE_ANG_OFF  PRO_SURFACE (plane)
   PRO_ASM_FIX           PRO_CSYS (Note that the reference status will be 
                                 PRO_REF_MISSING if the constraint references 
                                 the default assembly coordinate system 
                                 instead of a user-selected one).
   PRO_ASM_EXPLICIT      (Note: Internal use, should not be set)
   PRO_ASM_AUTO          (Note: Internal use, should not be set)
   PRO_ASM_CSYS_PNT      PRO_CSYS
   PRO_ASM_LINE_NORMAL   PRO_AXIS, PRO_EDGE
   PRO_ASM_LINE_COPLANAR PRO_AXIS, PRO_EDGE
   PRO_ASM_LINE_PARL     PRO_AXIS, PRO_EDGE
   PRO_ASM_LINE_DIST     PRO_AXIS, PRO_EDGE
   PRO_ASM_PNT_DIST      PRO_POINT
   PRO_ASM_INSERT_NORM   PRO_SURFACE (Cylinder, Cone, Torus)
   PRO_ASM_INSERT_PARL   PRO_SURFACE (Cylinder, Cone, Torus)
   PRO_ASM_PNT_ON_LINE_DIST     PRO_POINT, PRO_EDGE, PRO_AXIS
   PRO_ASM_PNT_ON_SRF_DIST      PRO_POINT, PRO_SURFACE (Plane)
   PRO_ASM_EDGE_ON_SRF_DIST     PRO_POINT, PRO_SURFACE (Plane)
   PRO_ASM_EDGE_ON_SRF_ANG      PRO_EDGE, PRO_SURFACE (Plane)
   PRO_ASM_EDGE_ON_SRF_NORMAL   PRO_EDGE, PRO_SURFACE (Plane)
   PRO_ASM_EDGE_ON_SRF_PARL     PRO_EDGE, PRO_SURFACE (Plane)
   PRO_ASM_ALIGN_NODEP_ANGLE    PRO_SURFACE (plane)
   PRO_ASM_MATE_NODEP_ANGLE     PRO_SURFACE (plane)
   PRO_ASM_LINE_ANGLE    PRO_AXIS, PRO_EDGE (Note this is the angle between two
                                             edge/axis that are also coplanar)
   PRO_ASM_SRF_NORMAL    PRO_SURFACE (plane)

   Note 2.   JAS Limits valid values:
   
   (-360, 360] is valid for rotational joint types. 
   Linear joint types may accept any value.

   Note 3.

   For connection constraint sets it means ProConnectionFlipState.


\*****************************************************************************/

/* 1. PRO_E_COMPONENT_CONSTR_TYPE */

typedef enum pro_asm_constraint_type
{
   PRO_ASM_UNDEF = -1,
   PRO_ASM_MATE = 0,
   PRO_ASM_MATE_OFF,
   PRO_ASM_ALIGN,
   PRO_ASM_ALIGN_OFF,
   PRO_ASM_INSERT,
   PRO_ASM_ORIENT,
   PRO_ASM_CSYS,
   PRO_ASM_TANGENT,
   PRO_ASM_PNT_ON_SRF,
   PRO_ASM_EDGE_ON_SRF,
   PRO_ASM_DEF_PLACEMENT,
   PRO_ASM_SUBSTITUTE,
   PRO_ASM_PNT_ON_LINE,
   PRO_ASM_FIX,
   PRO_ASM_AUTO,
   PRO_ASM_ALIGN_ANG_OFF,
   PRO_ASM_MATE_ANG_OFF,
   PRO_ASM_CSYS_PNT,
   PRO_ASM_LINE_NORMAL,
   PRO_ASM_LINE_COPLANAR,
   PRO_ASM_LINE_PARL,
   PRO_ASM_LINE_DIST,
   PRO_ASM_PNT_DIST,
   PRO_ASM_INSERT_NORM,
   PRO_ASM_INSERT_PARL,
   PRO_ASM_PNT_ON_LINE_DIST,
   PRO_ASM_PNT_ON_SRF_DIST,
   PRO_ASM_EDGE_ON_SRF_DIST,
   PRO_ASM_EDGE_ON_SRF_ANG,
   PRO_ASM_EDGE_ON_SRF_NORMAL,
   PRO_ASM_ALIGN_NODEP_ANGLE,
   PRO_ASM_MATE_NODEP_ANGLE,
   PRO_ASM_LINE_ANGLE,
   PRO_ASM_EDGE_ON_SRF_PARL,
   PRO_ASM_SRF_NORMAL,
   PRO_ASM_EXPLICIT,
   PRO_ASM_TANGENT_ALIGN

} Pro_asm_constraint_type, ProAsmcompConstrType;

/*
This is a secondary flip used for connections only and working together with 
constraint type (ProAsmcompConstrType). It should (mainly) be used 
when it is impossible to flip the ProAsmcompConstrType (mate vs align etc.).
*/
typedef enum {
    PRO_ASM_FLIP_UNDEFINED = 0,
    PRO_ASM_FLIPPED,
    PRO_ASM_NOT_FLIPPED
} ProConnectionFlipState;

typedef enum {
    PRO_ASM_SET_TYPE_FIXED = 0,
    PRO_ASM_SET_TYPE_PIN,
    PRO_ASM_SET_TYPE_SLIDER,
    PRO_ASM_SET_TYPE_CYLINDRICAL,
    PRO_ASM_SET_TYPE_PLANAR,
    PRO_ASM_SET_TYPE_BALL,
    PRO_ASM_SET_TYPE_WELD,
    PRO_ASM_SET_TYPE_BEARING,
    PRO_ASM_SET_TYPE_GENERAL,
    PRO_ASM_SET_TYPE_6DOF,
    PRO_ASM_SET_TYPE_SLOT,
    PRO_ASM_SET_TYPE_GIMBAL,
    PRO_ASM_SET_TYPE_DMA_DEFINED,         /* Reserved for internal use only */
    PRO_ASM_SET_TYPE_TRANSFORM,           /* Reserved for internal use only */
    PRO_ASM_SET_USER_DEFINED_TYPE = 5200
}ProAsmcompSetType;

typedef enum pro_comp_set_attr_type
{
   PRO_ASM_ENABLE_COMP_SET,
   PRO_ASM_DISABLE_COMP_SET
} PmConnectionAttr;

typedef enum pro_intfc_placement_type
{
   PRO_ASM_INTFC_NONE    = 0,
   PRO_ASM_INTFC_TO_GEOM = 1,
   PRO_ASM_INTFC_TO_INTFC
} IntfcPlaceType;

/* Symbol maintained for compatibility - use PRO_ASM_FIX instead. */
#define PRO_ASM_DEF_CSYS  PRO_ASM_FIX

typedef enum pro_asm_comp_movement_type
{
   PRO_ASM_TRANSLATE_X,
   PRO_ASM_TRANSLATE_Y,
   PRO_ASM_TRANSLATE_Z,
   PRO_ASM_ROTATE_X,
   PRO_ASM_ROTATE_Y,
   PRO_ASM_ROTATE_Z,
   PRO_ASM_TWIST_FIT
} ProAsmcompMoveType;

#define  PRO_ASM_TYPE_NOT_DEFINED  -777


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

/* Note 2.   Constraint Attributes  */

#define PRO_ASM_CONSTR_ATTR_NONE      (0)     /* No constraint attributes */
#define PRO_ASM_CONSTR_ATTR_IGNORE    (1<<0)  /* Constraint is ignored during regeneration.  For PTC internal use only.  */
#define PRO_ASM_CONSTR_ATTR_FORCE     (1<<1) /* Constraint has to be forced for line, pnt align. */
#define PRO_ASM_CONSTR_ATTR_INTFC_DEPENDENT    (1<<2) /* When set in a component interface, the constraint cannot be changed by application of settings making it coincident, offset, or reoriented. */
#define PRO_ASM_CONSTR_ATTR_INACTIVE (1<<5) /* constraint has been set to be inactive */

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

typedef                struct pro_model_item  ProAsmcomp;

typedef enum  ProAsmcompTypes  {
  PRO_ASM_COMP_TYPE_NONE        = 0,     /* "usual" (non-mfg/mold/cast) case */
  PRO_ASM_COMP_TYPE_WORKPIECE   = 1,
  PRO_ASM_COMP_TYPE_REF_MODEL   = 2,
  PRO_ASM_COMP_TYPE_FIXTURE     = 3,
  PRO_ASM_COMP_TYPE_MOLD_BASE   = 4,
  PRO_ASM_COMP_TYPE_MOLD_COMP   = 5,
  PRO_ASM_COMP_TYPE_MOLD_ASSEM  = 6,
  PRO_ASM_COMP_TYPE_GEN_ASSEM   = 7,
  PRO_ASM_COMP_TYPE_CAST_ASSEM  = 8,
  PRO_ASM_COMP_TYPE_DIE_BLOCK   = 9,
  PRO_ASM_COMP_TYPE_DIE_COMP    = 10,
  PRO_ASM_COMP_TYPE_SAND_CORE   = 11,
  PRO_ASM_COMP_TYPE_CAST_RESULT = 12,
  PRO_ASM_COMP_TYPE_FROM_MOTION = 13,           /* Replaced, see note 5 */
  PRO_ASM_COMP_TYPE_NO_DEF_ASSUM = 14           /* Replaced, see note 5 */
}  ProAsmcompType;

/*===========================================================================*/
/*   Note 5:   Component misc attributes.  
               PRO_ASM_COMP_ATTR_FROM_MOTION will replace PRO_ASM_COMP_TYPE_FROM_MOTION
               PRO_ASM_COMP_ATTR_NO_DEFAULT_ASSUMP will replace PRO_ASM_COMP_TYPE_NO_DEF_ASSUM */

#define PRO_ASM_COMP_ATTR_FROM_MOTION           (1<<5)
#define PRO_ASM_COMP_ATTR_NO_DEFAULT_ASSUMP     (1<<6)
#define PRO_ASM_COMP_ATTR_USE_CRITERIA_MISMATCH (1<<7)
#define PRO_ASM_COMP_ATTR_BACKUP_REFERENCES     (1<<8)
#define PRO_ASM_COMP_ATTR_SUSPEND_UPDATE        (1<<9)
/*===========================================================================*/




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

typedef enum pro_asm_comp_motion_type {
        PRO_M_UNDEF,
        PRO_M_TRANSLATE,
        PRO_M_ROTATE,
        PRO_M_ADJUST,
        PRO_M_ORIENTMODE
} ProMotionType;

typedef enum pro_asm_comp_motion_ref_type {
        PRO_M_VIEW_PLANE,
        PRO_M_SEL_PLANE,
        PRO_M_ENTITY_EDGE,
        PRO_M_PLANE_NORMAL,
        PRO_M_2_POINTS,
        PRO_M_CSYS_X,
        PRO_M_CSYS_Y,
        PRO_M_CSYS_Z
} ProMotionRefType;

typedef enum pro_axis_zero_type 
{
  PRO_AXIS_ZERO_UNDEF_TYPE =  -1,
  PRO_AXIS_ZERO_TRANSLATE1 , /* 0 */
  PRO_AXIS_ZERO_TRANSLATE2 , /* 1 */
  PRO_AXIS_ZERO_TRANSLATE3 , /* 2 */
  PRO_AXIS_ZERO_ROTATION1 ,  /* 3 */
  PRO_AXIS_ZERO_ROTATION2 ,  /* 4 */
  PRO_AXIS_ZERO_ROTATION3 ,  /* 5 */
  PRO_AXIS_ZERO_SLOT ,       /* 6 */
  PRO_AXIS_ZERO_CONE,        /* 7 */
   /*______________________________________________________________________*/
  /* Add new motion limit zero types above the line ^                     */
  PRO_AXIS_ZERO_TYPE_COUNT
} ProAxiszerotype;

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

extern ProError ProAsmcompVisibilityGet  (ProAsmcomppath *p_comp_path,
                                          ProSimprep     *p_simp_rep,
                                          ProBoolean     *p_visibility);
/*
    Purpose: Returns the visibility of the specified component.

    Input Arguments:
        p_comp_path - The path to the member.
        p_simp_rep - The handle to the simplified representation. If this is 
                     NULL, the function uses the current, active representation 
                     of the current assembly.

    Output Arguments:
        p_visibility - This is PRO_B_TRUE if the component is visible in the 
                       simplified representation; otherwise, this is 
                       PRO_B_FALSE.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the information.
        PRO_TK_BAD_INPUTS - One or more of the input arguments are invalid.
        PRO_TK_BAD_CONTEXT - The assembly is in the master representation.

*/

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

extern ProError  ProAsmcompTypeGet  (ProAsmcomp*                 comp,
                                      PRO_CONST_ARG ProAssembly   top_assem,
                                     ProAsmcompType             *r_type );
/*
    Purpose: Retrieves the type of the specified component.

    Input Arguments:
        comp - The handle to the component feature
        top_assem - The handle to the top-level assembly

    Output Arguments:
        r_type - The component type

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the information.
        PRO_TK_BAD_INPUTS - One or more of the input arguments are invalid.

*/

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

extern ProError  ProAsmcompTypeSet (ProAsmcomp*                 comp,
                                     PRO_CONST_ARG ProAssembly   top_assem,
                                    ProAsmcompType              type );
/*
    Purpose: Sets the type of the specified component.

    Input Arguments:
        comp - The handle to the component feature
        top_assem - The handle to the top-level assembly
        type - The component type

    Output Arguments:
        none

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

*/

extern ProError ProAsmcompMdlGet (ProAsmcomp *p_feat_handle,
                                  ProMdl     *p_mdl_handle);
/*
    Purpose: Retrieves the component model, given a component feature.

    Input Arguments:
        p_feat_handle - The handle to the component feature

    Output Arguments:
        p_mdl_handle - The model handle to be initialized

    Return Values:
        PRO_TK_NO_ERROR - The argument corresponds to a valid component feature 
                          with a valid component model.
        PRO_TK_BAD_INPUTS - The specified feature is not a valid component 
                            feature.
        PRO_TK_E_NOT_FOUND - Assembly component model is not a solid or is not 
                             in memory.

*/

extern ProError ProAsmcompIsBulkitem (ProAsmcomp *p_comp_handle,
                                      ProBoolean *p_is_bulk_item);
/*
    Purpose: Determines whether the specified component is a bulk item.

    Input Arguments:
        p_comp_handle - The component to be checked.

    Output Arguments:
        p_is_bulk_item - This is PRO_B_TRUE if the component is a bulk item; 
                         otherwise, this is PRO_B_FALSE.

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

*/

extern ProError ProAsmcompConstrRedefUI (ProAsmcomp *p_feat_handle);
/*
    Purpose: Invokes the user interface to redefine component constraints.

    Input Arguments:
        p_feat_handle - The handle to the component to redefine. Note that this 
                        cannot be NULL.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The argument corresponds to a valid component feature 
                          redefinition.
        PRO_TK_BAD_INPUTS - The specified feature is not a valid component 
                            feature.
        PRO_TK_USER_ABORT - The user aborted component redefinition.

*/

/*------------------------ CONSTRAINT RELATED API's ----------------------*/


typedef struct pro_asm_constraint_full* ProAsmcompconstraint;

typedef enum pro_datum_side
{
   PRO_DATUM_SIDE_RED = -1,
   PRO_DATUM_SIDE_NONE =  0,
   PRO_DATUM_SIDE_YELLOW = 1
} ProDatumside;


extern ProError ProAsmcompConstraintsWithDtmOrientGet (ProAsmcomp *component,
                                        ProAsmcompconstraint **pp_constraints );
/*
    Purpose: retrieves an array of constraints for a given Assembly component 
             where constraints orientation has value with respect to datum 
             plane. This function supersedes ProAsmcompConstraintsGet.

    Input Arguments:
        component - The assembly component

    Output Arguments:
        pp_constraints - ProArray of constraints

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the information.
        PRO_TK_INVALID_TYPE - The component argument is not a valid assembly 
                              component.
        PRO_TK_BAD_INPUTS - The input is invalid.
        PRO_TK_E_NOT_FOUND - The assembly component does not have any 
                             constraints.

*/

extern ProError ProAsmcompConstraintsWithComppathGet (
                                        ProAsmcomp            *component,
                                        ProAsmcomppath        *component_path,
                                        ProAsmcompconstraint **pp_constraints );
/*
    Purpose: retrieves an array of constraints for a given Assembly component 
             where constraints orientation has value with respect to datum 
             plane and uses component path. This function supersedes 
             ProAsmcompConstraintsWithDtmOrientGet.

    Input Arguments:
        component - The assembly component
        component_path - The path to the owner assembly, if the constraints 
                         have references to other members of the top level 
                         assembly. If the constraints are only with respect to 
                         the assembly owner in component, this should be NULL.

    Output Arguments:
        pp_constraints - ProArray of constraints

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the information.
        PRO_TK_INVALID_TYPE - The component argument is not a valid assembly 
                              component.
        PRO_TK_BAD_INPUTS - The input is invalid.
        PRO_TK_E_NOT_FOUND - The assembly component does not have any 
                             constraints.

*/

extern ProError ProAsmcompConstraintsSet (ProAsmcomppath* component_path, 
                                          ProAsmcomp *component,
                                          ProAsmcompconstraint *p_constraints );
/*
    Purpose: sets an array of constraints for a given Assembly component. This 
             function modifies the component feature data and regenerates the 
             assembly component.

    Input Arguments:
        component_path - The path to the owner assembly, if the contstraints 
                         have references to other members of the top level 
                         assembly. If the constraints are only with respect to 
                         the assembly owner in component, this should be NULL.
        component - The assembly component
        p_constraints - ProArray of constraints

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully set the information.
        PRO_TK_BAD_INPUTS - The input is invalid.
        PRO_TK_INVALID_TYPE - The component argument is not a valid assembly 
                              component.
        PRO_TK_INVALID_PTR - The p_constraints array is not a valid ProArray.
        PRO_TK_GENERAL_ERROR - Regeneration using the specified constraints 
                               failed; the component reverted to the previous 
                               configuration.

    See Also:
        ProWindowRepaint()
        ProTreetoolRefresh()
*/


extern  ProError ProAsmcompconstraintAlloc ( ProAsmcompconstraint *p_constraint );
/*
    Purpose: Allocates memory for an assembly component constraint structure.

    Input Arguments:
        none

    Output Arguments:
        p_constraint - The Asmcomp constraint structure

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

*/

extern ProError ProAsmcompconstraintFree ( ProAsmcompconstraint constraint );
/*
    Purpose: Frees all underlying memory of the assembly component constraint 
             structure.

    Input Arguments:
        constraint - The Asmcomp constraint structure.

    Output Arguments:
        none

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

*/

extern ProError ProAsmcompconstraintArrayFree ( ProAsmcompconstraint* constraint_array );
/*
    Purpose: Frees all underlying memory of an assembly component constraints 
             array.

    Input Arguments:
        constraint_array - The Asmcomp constraint ProArray.

    Output Arguments:
        none

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

*/


extern ProError ProAsmcompconstraintTypeGet ( ProAsmcompconstraint constraint,ProAsmcompConstrType *type );
/*
    Purpose: retrieves the constraint type for the given constraint.

    Input Arguments:
        constraint - The Assembly component constraint.

    Output Arguments:
        type - The constraint type.

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

*/

extern ProError ProAsmcompconstraintTypeSet ( ProAsmcompconstraint constraint,ProAsmcompConstrType type );
/*
    Purpose: sets the constraint type for the specified constraint.

    Input Arguments:
        constraint - The Assembly component constraint.
        type - The constraint type.

    Output Arguments:
        none

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

*/

extern ProError ProAsmcompconstraintAsmreferenceGet ( ProAsmcompconstraint constraint,
                                                      ProSelection *asm_ref,
                                                      ProDatumside *asm_orient);
/*
    Purpose: retrieves the constraint references and orientations for the given 
             constraint.

    Input Arguments:
        constraint - The Assembly component constraint.

    Output Arguments:
        asm_ref - The assembly reference.
        asm_orient - assembly orientation

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the information.
        PRO_TK_BAD_INPUTS - The argument is invalid.
        PRO_TK_E_NOT_FOUND - Assembly reference not found .
        PRO_TK_GENERAL_ERROR - Information retrieval failed .

*/

extern ProError ProAsmcompconstraintAsmreferenceSet ( ProAsmcompconstraint constraint,
                                                      ProSelection asm_ref,
                                                      ProDatumside asm_orient);
/*
    Purpose: sets the constraint references and orientations to the specified 
             constraint.

    Input Arguments:
        constraint - The Assembly component constraint.
        asm_ref - The assembly reference.
        asm_orient - assembly orientation

    Output Arguments:
        none

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

*/

extern ProError ProAsmcompconstraintCompreferenceGet ( ProAsmcompconstraint constraint,
                                                       ProSelection *comp_ref,
                                                       ProDatumside *comp_orient);
/*
    Purpose: retrieves the constraint references and orientations for the given 
             constraint.

    Input Arguments:
        constraint - The Assembly component constraint.

    Output Arguments:
        comp_ref - The component reference.
        comp_orient - component orientation

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the information.
        PRO_TK_BAD_INPUTS - The argument is invalid.
        PRO_TK_E_NOT_FOUND - Component reference not found .
        PRO_TK_GENERAL_ERROR - Information retrieval failed .

*/

extern ProError ProAsmcompconstraintCompreferenceSet ( ProAsmcompconstraint constraint,
                                                       ProSelection comp_ref,
                                                       ProDatumside comp_orient);
/*
    Purpose: sets the constraint references and orientations to the specified 
             constraint.

    Input Arguments:
        constraint - The Assembly component constraint.
        comp_ref - The component reference.
        comp_orient - component orientation

    Output Arguments:
        none

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

*/

extern ProError ProAsmcompconstraintOffsetGet ( ProAsmcompconstraint constraint,
                                                double *offset);
/*
    Purpose: retrieves the mate/align offset value for the given constraint.

    Input Arguments:
        constraint - The Assembly component constraint.

    Output Arguments:
        offset - The mate/align offset value.

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

*/

extern ProError ProAsmcompconstraintOffsetSet (ProAsmcompconstraint constraint,
                                               double offset);
/*
    Purpose: sets the mate/align offset value to the specifiedconstraint.

    Input Arguments:
        constraint - The Assembly component constraint.
        offset - The offset value.

    Output Arguments:
        none

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

*/

extern ProError ProAsmcompconstraintAttributesGet ( ProAsmcompconstraint constraint,
                                                    int *attributes);
/*
    Purpose: retrieves the constraint attributes for the givenconstraint.

    Input Arguments:
        constraint - The Assembly component constraint.

    Output Arguments:
        attributes - The constraint attributes.

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

*/

extern ProError ProAsmcompconstraintAttributesSet ( ProAsmcompconstraint constraint ,
                                                    int attributes);
/*
    Purpose: sets the constraint attributes to the specifiedconstraint.

    Input Arguments:
        constraint - The Assembly component constraint.
        attributes - The constraint attributes.

    Output Arguments:
        none

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

*/


extern ProError ProAsmcompconstraintUserdataGet ( ProAsmcompconstraint constraint,
                                                  wchar_t** usr_data);
/*
    Purpose: retrieves the user data for the given constraint.

    Input Arguments:
        constraint - The Assembly component constraint.

    Output Arguments:
        usr_data - User data. Free the memory for this string using 
                   ProWstringFree().

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved theinformation.
        PRO_TK_BAD_INPUTS - The argument is invalid.
        PRO_TK_E_NOT_FOUND - User data not found .

*/

extern ProError ProAsmcompconstraintUserdataSet ( ProAsmcompconstraint constraint,
                                                  wchar_t* usr_data);
/*
    Purpose: sets the user data to the specified constraint.

    Input Arguments:
        constraint - The Assembly component constraint.
        usr_data - User data.

    Output Arguments:
        none

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

*/

extern ProError ProAsmcompAssemble ( ProAssembly   owner_assembly,
                                     ProSolid           component_model,
                                     ProMatrix           init_pos,
                                     ProAsmcomp *feature );
/*
    Purpose: Adds a component to a specified assembly or sub-assembly at the 
             specified initial position.

    Input Arguments:
        owner_assembly - The assembly/sub-assembly into which the component is 
                         added. NULL is a valid argument.Current Assembly is 
                         used in this case .
        component_model - The assembly component model
        init_pos - The component initial position

    Output Arguments:
        feature - handle to the newly created assembly componennt.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully created an assembly 
                          =component.
        PRO_TK_BAD_INPUTS - The input is invalid.
        PRO_TK_UNSUPPORTED - Unsupported model. For instance, models which come 
                             from Multi-CAD model approach, are not supported 
                             in this release.
        PRO_TK_GENERAL_ERROR - Component creation failed. Returns this error if 
                               called to add embedded component in different 
                               owner assembly.

*/

extern ProError   ProAsmcompPositionGet (ProAsmcomp*     component,
                                         ProMatrix    position);
/*
    Purpose: Retrieves the component's initial position before constraints and 
             movements have been applied. If the component is fully packaged 
             this position is the same as the constraint's actual position.

    Input Arguments:
        component - The assembly component

    Output Arguments:
        position - The position

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the information.
        PRO_TK_BAD_INPUTS - The input argument was invalid.
        PRO_TK_E_NOT_FOUND - The input argument was of type - bulk item .

*/


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

extern ProError   ProAsmcompPositionSet (ProAsmcomppath* component_path,
                                  ProAsmcomp*     component,
                                  ProMatrix      position);
/*
    Purpose: Sets the component's initial position before constraints and 
             movements have been applied. If the component is packaged this 
             position helps to determine the component's actual position. This 
             function modifies the assembly component data but does not 
             regenerate the assembly component. To regenerate the component, 
             use ProAsmcompRegenerate().

    Input Arguments:
        component_path - The path from the top level assembly to the component 
                         feature. Required if the component has external 
                         references to geometry outside of the immediate 
                         assembly. If the component does not have any external 
                         references, NULL is allowed.
        component - The assembly component
        position - The position

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the information.
        PRO_TK_BAD_INPUTS - An input argument was invalid or component is of
        type - bulk item .

*/

extern ProError ProAsmcompRegenerate  (ProAsmcomp *p_comp_handle,
                                       ProBoolean  update_soft);
/*
    Purpose: Regenerates placement instructions.

    Input Arguments:
        p_comp_handle - The component to regenerate.
        update_soft - Reserved for future use.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The argument corresponds to a valid component feature 
                          with a valid component model.
        PRO_TK_BAD_INPUTS - The specified feature is not a valid component 
                            feature.

*/

extern ProError ProAsmcompPackageMove (ProAsmcomp *p_feat_handle,
                                       ProMotionType motion_type,
                                       ProBoolean    showui,
                                       ProMotionRefType motion_ref_type,
                                       ProSelection         motion_ref[],
                                       int                  sel_sz);
/*
    Purpose: Invokes the package move interface for the specified component. 
             Default values for the old behavior: 
             <UL> 
             <LI>p_feat_handle: The component to be "moved" 
             <LI>motion_type: PRO_M_UNDEF 
             <LI>showui: PRO_B_TRUE 
             <LI>motion_ref_type: PRO_M_VIEW_PLANE 
             <LI>motion_ref[]: NULL 
             <LI>sel_sz: 0 
             </UL>

    Input Arguments:
        p_feat_handle - The component to be "moved"
        motion_type - See the enum ProMotionType
        showui - Dialog or action only
        motion_ref_type - See the enum ProMotionRefType
        motion_ref - Array of sel ptrs
        sel_sz - Array size.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The argument corresponds to a valid component feature 
                          with a valid component model.
        PRO_TK_BAD_INPUTS - The specified feature is not a valid component 
                            feature.
        PRO_TK_USER_ABORT - The package move was aborted by the user.

*/


extern ProError ProAsmcompMdlMdlnameGet (ProAsmcomp      *p_asm_comp_handle,
                                         ProMdlfileType  *r_mdl_type,
                                         ProFamilyMdlName r_mdl_name);
/*
    Purpose: Retrieves the name and type of the model, given the handle to the 
             assembly component. <b>Note:</b> In Creo 3 this function does not 
             support names longer than 80 characters. It will return 
             PRO_TK_BAD_INPUTS for longer names. The support for 
             ProFamilyMdlName will be added in a future release.

    Input Arguments:
        p_asm_comp_handle - The handle to the assembly component

    Output Arguments:
        r_mdl_type - The model type
        r_mdl_name - The name of the model. Free this argument using 
                     ProWstringFree.

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

*/

extern ProError ProAsmcompMdldataGet (ProAsmcomp      *p_asm_comp_handle,
                                      ProMdlType      *r_mdl_type,
                                      ProMdlfileType  *r_mdl_filetype,
                                      ProFamilyMdlName r_mdl_name);
/*
    Purpose: Retrieves the name and type of the model, given the handle to the 
             assembly component. <b>Note:</b> In Creo 3 this function does not 
             support names longer than 80 characters. It will return 
             PRO_TK_BAD_INPUTS for longer names. The support for 
             ProFamilyMdlName will be added in a future release.

    Input Arguments:
        p_asm_comp_handle - The handle to the assembly component. Cannot be 
                            NULL.

    Output Arguments:
        r_mdl_type - The model type. Can be NULL.
        r_mdl_filetype - The model filetype. Can be NULL.
        r_mdl_name - The name of the model. Free this argument using 
                     ProWstringFree. Can be NULL.

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

*/

extern ProError ProAsmcompConstrRemove  (ProAsmcomp *p_feat_handle,
                                                    int         index);
/*
    Purpose: Removes a component constraint, given a handle to the assembly 
             component and the index of the constraint to remove. Intrfc 
             constraint remains intact since main intrfc plin couldn't be 
             removed whence all plins will be restored upon regen.

    Input Arguments:
        p_feat_handle - The handle to the assembly component.
        index - The index of component to be removed. Indexing begins with 0 
                and continues to (<i>number of constraints</i>-1). An index of 
                -1 removes all the constraints.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully removed the constraint.
        PRO_TK_BAD_INPUTS - The specified feature is not a valid component 
                            feature.
        PRO_TK_E_NOT_FOUND - The specified constraint does not exist.

*/

extern ProError ProAsmcompAllConstrRemove (ProAsmcomp *p_feat_handle);
/*
    Purpose: Removes all component constraints, given a handle to the assembly 
             component.

    Input Arguments:
        p_feat_handle - The handle to the assembly component.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully removed all constraints.
        PRO_TK_BAD_INPUTS - The specified feature is not a valid component 
                            feature.

*/


extern ProError ProAsmcompMdlnameCreateCopy (ProAssembly  assembly,
                                             ProMdlName   comp_name,
                                             ProMdlType   comp_type,
                                             ProMdl       template_model,
                                             ProBoolean   leave_unplaced,
                                             ProAsmcomp  *p_comp_handle);
/*
    Purpose: Create a new component in the specified assembly by copying from 
             the specified model. If no model is specified, the new component 
             is created empty. This function either places the new component at 
             a default location in the assembly or leaves it unplaced. This 
             function also initializes the component handle. <b>Note:</b> In 
             Creo 3 this function does not support names longer than 31 
             characters. It will return PRO_TK_LINE_TOO_LONG for longer names. 
             The support for ProMdlName will be added in a future release.

    Input Arguments:
        assembly - The specified assembly.
        comp_name - The new component name.
        comp_type - The new component type; must be either PRO_MDL_ASSEMBLY or 
                    PRO_MDL_PART.
        template_model - Handle to model to be used as a template. If NULL, 
                         empty component will be created.
        leave_unplaced - If PRO_B_TRUE, the component is left unplaced. If 
                         PRO_B_FALSE, the component is placed by default.

    Output Arguments:
        p_comp_handle - Handle to the new component to be initialized.

    Return Values:
        PRO_TK_NO_ERROR - Component add was successful.
        PRO_TK_BAD_INPUTS - Invalid name or type for assembly handle or 
                            component; or invalid template handle.
        PRO_TK_INVALID_TYPE - Template type does not correspond to component 
                              type.
        PRO_TK_ABORT - The model can not be used as a template or has external 
                       dependencies. Copy is aborted.
        PRO_TK_GENERAL_ERROR - Component creation failed.
        PRO_TK_NOT_VALID - Required license not found.
        PRO_TK_LINE_TOO_LONG - comp_name length of the new component is more 
                               than 31 chars. This restriction will be removed 
                               in future releases.
        PRO_TK_UNSUPPORTED - Unsupported model. For instance, models which come 
                             from Multi-CAD model approach, are not supported 
                             in this release.

*/

extern ProError ProAsmcompIsUnplaced  (ProAsmcomp *comp_handle,
                                             ProBoolean *p_comp_is_unplaced);
/*
    Purpose: Determine if the specified component is unplaced.

    Input Arguments:
        comp_handle - Handle to the component to be checked.

    Output Arguments:
        p_comp_is_unplaced - PRO_B_TRUE if the component is unplaced, otherwise 
                             PRO_B_FALSE.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully returned the information.
        PRO_TK_BAD_INPUTS - The component handle is invalid.
        PRO_TK_NOT_VALID - Required license not found.

*/

extern ProError ProAsmcompFillFromMdl (ProAsmcomp *comp_handle,
                                       ProMdl      template_model);
/*
    Purpose: Copy specified template into a model of the specified component.

    Input Arguments:
        comp_handle - Handle to the component.
        template_model - Handle to the model to be used as the copy template.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The action has been successfully performed.
        PRO_TK_BAD_INPUTS - The component handle is invalid; or the template 
                            handle is invalid; or the template type does not 
                            correspond to that of the component model.
        PRO_TK_INVALID_TYPE - The template type does not correspond to the 
                              component type.
        PRO_TK_E_FOUND - Features exist in a model of the component; copying 
                         the template to this model is not allowed.
        PRO_TK_ABORT - The model can not be used as a template or has external 
                       dependencies. Copy is aborted.
        PRO_TK_GENERAL_ERROR - Component creation failed.
        PRO_TK_NOT_VALID - Required license not found.
        PRO_TK_UNSUPPORTED - Unsupported model. For instance, embedded models.

*/

extern ProError ProAsmcompIsPlaced (ProAsmcomp *p_comp,
                                    ProBoolean *p_is_placed);
/*
    Purpose: Determine whether the specified component is placed.

    Input Arguments:
        p_comp - The component to be checked.

    Output Arguments:
        p_is_placed - This is PRO_B_TRUE if the component is placed; otherwise, 
                      this is PRO_B_FALSE.

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

*/

extern ProError ProAsmcompSetPlaced (ProAsmcomp *p_comp,
                                     ProBoolean  p_is_placed);
/*
    Purpose: Set the placed flag for the specified component.

    Input Arguments:
        p_comp - The component to set the placed flag.
        p_is_placed - The flag that needs to be set. It is either PRO_B_TRUE or 
                      PRO_B_FALSE.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function succeeded in setting the value.
        PRO_TK_BAD_INPUTS - The input argument is invalid.

*/

extern ProError ProAsmcompMakeUniqueSubasm (ProAsmcomppath *p_path);
/*
    Purpose: Make a new instance of a sub-assembly, given its path.

    Input Arguments:
        p_path - The path from the top level assembly to the specified unique 
                 sub-assembly.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully created a new instance.
        PRO_TK_BAD_INPUTS - The path is invalid.

*/

extern ProError ProAsmcompRmvUniqueSubasm  (ProAsmcomppath *p_path);
/*
    Purpose: Remove the run-time instance of a unique sub-assembly, given its 
             path.

    Input Arguments:
        p_path - The path from top level assembly to the unique sub-assembly 
                 which is to be removed.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully removed the new instance.
        PRO_TK_BAD_INPUTS - The path is invalid.

*/

extern ProError ProAsmcompIsSubstitute (ProAsmcomp *p_comp,
                                        ProBoolean *p_is_sub);
/*
    Purpose: Determine whether the specified component is substituted.

    Input Arguments:
        p_comp - The component to be checked.

    Output Arguments:
        p_is_sub - This is PRO_B_TRUE if the component is substituted; 
                   otherwise, this is PRO_B_FALSE.

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

*/



extern ProError ProAsmcompIsPackaged (ProAsmcomp  *comp_handle,
                                      ProBoolean  *p_comp_is_packaged );
/*
    Purpose: Determine if the specified component is packaged.

    Input Arguments:
        comp_handle - Handle to the component to be checked.

    Output Arguments:
        p_comp_is_packaged - PRO_B_TRUE if the component is packaged, otherwise 
                             PRO_B_FALSE.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully returned the information.
        PRO_TK_BAD_INPUTS - The component handle is invalid.

*/



extern ProError ProAsmcompIsFrozen (ProAsmcomp  *comp_handle,
                                    ProBoolean  *p_comp_is_frozen );
/*
    Purpose: Determine if the specified component is frozen.

    Input Arguments:
        comp_handle - Handle to the component to be checked.

    Output Arguments:
        p_comp_is_frozen - PRO_B_TRUE if the component is frozen, otherwise 
                           PRO_B_FALSE.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully returned the information.
        PRO_TK_BAD_INPUTS - The component handle is invalid.

*/



extern ProError ProAsmcompIsUnderconstrained(ProAsmcomp *comp_handle,
                                             ProBoolean *p_comp_is_underconstrained);
/*
    Purpose: Determine if the specified component is underconstrained.

    Input Arguments:
        comp_handle - Handle to the component to be checked.

    Output Arguments:
        p_comp_is_underconstrained - PRO_B_TRUE if the component is 
                                     underconstrained, otherwise PRO_B_FALSE.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully returned the information.
        PRO_TK_BAD_INPUTS - The component handle is invalid.

*/

extern ProError ProAsmcompAsmitemInit (ProMdl p_owner_handle, int item_id,
  ProType item_type, ProName name, ProAsmcomppath *path,
  ProAsmitem  *p_handle);
/*
    Purpose: Initializes the ProAsmitem handle.

    Input Arguments:
        p_owner_handle - The model owner of the item
        item_id - The item identifier
        item_type - The item type
        name - The parameter name : used for PRO_PARAMETER in this case 
               item_type should be PRO_PART or PRO_ASSEMBLY
        path - The item path. To set a component as flexible, the path of this 
               ProAsmitem should not contain the ID of a component which is 
               <ul> <li>out of flexible context. <li>to be made flexible. </ul>

    Output Arguments:
        p_handle - The handle to initialize

    Return Values:
        PRO_TK_NO_ERROR - The function successfully initialized the handle.
        PRO_TK_BAD_INPUTS - One or more of the input arguments are invalid or 
                            item was not found .

*/

extern ProError ProAsmcompIsFlexible (ProAsmcomp *p_comp_handle,
                                      ProBoolean *p_is_flex_comp);
/*
    Purpose: Determines whether the specified component is a flexible 
             component.

    Input Arguments:
        p_comp_handle - The component to be checked.

    Output Arguments:
        p_is_flex_comp - This is PRO_B_TRUE if the component is a flexible 
                         component; otherwise, this is PRO_B_FALSE.

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

*/

extern ProError ProAsmcompFlexiblemodelAdd (ProAsmcomp *comp, 
                ProAsmcomppath *p_flex_mdl_path,
                ProMdl *p_flex_model);
/*
    Purpose: Creates a flexible model from the specified model of the flexible 
             component.

    Input Arguments:
        comp - flexible component
        p_flex_mdl_path - relative path to flexible model from the top model of 
                          the flexible component

    Output Arguments:
        p_flex_model - the created flexible model

    Return Values:
        PRO_TK_NO_ERROR - The function succeeded.
        PRO_TK_BAD_INPUTS - The input argument is invalid.

*/

extern ProError ProAsmcompVarieditemsToModelAdd (ProMdl model, ProAsmitem  *varied_items);
/*
    Purpose: Add pre-defined flexible items to the regular component model to 
             be used later when calling 
             ProAsmcompFlexibleWithPredefineditemsSet(). All varied items are 
             replaced by the provided ones.

    Input Arguments:
        model - model which will contains the specified varied items
        varied_items - ProArray of varied items to be added as predefined 
                       flexibility for the specified model. Path of varied 
                       items should start from "model". All varied items are 
                       replaced by the provided ones.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function succeeded
        PRO_TK_BAD_INPUTS - The input argument is invalid.

*/
extern ProError ProAsmcompFlexibleWithPredefineditemsSet (ProAsmcomp *comp);
/*
    Purpose: convert the specified component to flexible one using the 
             predefined flexibility varied items defined on its component 
             model.

    Input Arguments:
        comp - The component to be converted to flexible one

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function succeeded
        PRO_TK_BAD_INPUTS - The input argument is invalid.

*/

extern ProError ProAsmcompFlexibleSet (ProAsmcomp *comp, 
                                       ProAsmitem *varied_items);
/*
    Purpose: convert the component to flexible one using the specified varied 
             items

    Input Arguments:
        comp - The component to be converted to flexible one
        varied_items - ProArray of varied items to be used for the flexible 
                       component definition. Path of varied items should start 
                       from "comp".

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function succeeded
        PRO_TK_BAD_INPUTS - The input argument is invalid.

*/

extern ProError ProAsmcompFlexibleUnset (ProAsmcomp *flexible_comp);
/*
    Purpose: convert a flexible component to the regular one

    Input Arguments:
        flexible_comp - The component to be converted to regular one

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function succeeded
        PRO_TK_BAD_INPUTS - The input argument is invalid.

*/

extern ProError ProAsmcompIsEmbedded(ProAsmcomp* component, ProBoolean* is_embedded);
/*
    Purpose: Identifies if the component is an embedded component or not.

    Input Arguments:
        component - The component.

    Output Arguments:
        is_embedded - PRO_B_TRUE if the component is embedded, 
                      PRO_B_FALSEotherwise.

    Return Values:
        PRO_TK_NO_ERROR - The function succeeded.
        PRO_TK_BAD_INPUTS - One or more input arguments was invalid.
        PRO_TK_GENERAL_ERROR - The function failed.

*/

extern ProError ProAsmcompEmbed(ProSelection comp_sel, ProBoolean embed_recursively);
/*
    Purpose: Embed selected component in its owner assembly.

    Input Arguments:
        comp_sel - Component selection.
        embed_recursively - Used only when comp_sel is sub-asm selection. If 
                            PRO_B_FALSE and comp_sel is sub-asm selection, then 
                            only sub-asm will be embedded. If PRO_B_TRUE and 
                            comp_sel is sub-asm then sub-asm and all its 
                            possible components will be embedded.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function succeeded.
        PRO_TK_BAD_INPUTS - The argument is invalid.
        PRO_TK_NO_CHANGE - Selected component is already embedded.

*/

extern ProError ProAsmcompExtract(ProSelection comp_sel, ProMdlName newMdlName);
/*
    Purpose: Extract selected component with input new name.

    Input Arguments:
        comp_sel - Component selection.
        newMdlName - New model name.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function succeeded.
        PRO_TK_BAD_INPUTS - The arguments is invalid.
        PRO_TK_NO_CHANGE - Selected component is not embedded.
        PRO_TK_E_FOUND - Model name exists. Please use a different model name.

*/

extern ProError ProAsmcompEmbeddedOwnerMdlGet(ProMdl embedded_mdl, ProMdl *p_owner_mdl);
/*
    Purpose: Returns non embedded owner model handle for the input embedded 
             model.

    Input Arguments:
        embedded_mdl - Embedded model.

    Output Arguments:
        p_owner_mdl - Non-embedded owner model handle for the input embedded 
                      model.

    Return Values:
        PRO_TK_NO_ERROR - The function succeeded.
        PRO_TK_BAD_INPUTS - The argument is invalid.
        PRO_TK_CANT_OPEN - Input component is not embedded.

*/

PRO_END_C_DECLS


#endif  /* PROASMCOMP_H */