#ifndef PROCOMPOSITE_H
#define PROCOMPOSITE_H

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



PRO_BEGIN_C_DECLS

typedef enum tk_cmpst_mass_prop_opt
{
    PRO_CMPST_MP_LAYUP_BASED,
    PRO_CMPST_MP_PLIES_BASED
} ProCompositeMassPropertyOption;


extern ProError ProCompositeMassPropertyOptionGet(ProMdl composite_mdl, ProCompositeMassPropertyOption* opt);
/*
    Purpose: Get mass property calculation option on composite solid.

    Input Arguments:
        composite_mdl - The composite model.

    Output Arguments:
        opt - option

    Return Values:
        PRO_TK_NO_ERROR - The function successfully returned the information.
        PRO_TK_BAD_INPUTS - The input argument is invalid.
        PRO_TK_INVALID_TYPE - Model is not a composite Model

*/

extern ProError ProCompositeMassPropertyOptionSet(ProMdl composite_mdl, ProCompositeMassPropertyOption opt);
/*
    Purpose: Set mass property calculation option on composite solid.

    Input Arguments:
        composite_mdl - The composite model.
        opt - option

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully returned the information.
        PRO_TK_BAD_INPUTS - The input argument is invalid.
        PRO_TK_INVALID_TYPE - Model is not a composite Model

*/

extern ProError ProCompositeMdlGet (ProFeature *p_feat_handle,
                                    ProMdl     *p_mdl_handle);
/*
    Purpose: Retrieves the composite model, given a composite feature. 
             <b>Note</b>: After changing anything in this model application 
             must regenerate top model (p_feat_handle->owner) using 
             ProSolidRegenerate()

    Input Arguments:
        p_feat_handle - The handle to the composite feature

    Output Arguments:
        p_mdl_handle - The model handle to be initialized

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

*/

extern ProError ProCompositeFeatureCreate (ProMdl     p_mdl_handle,
                                           ProFeature *p_feat_handle);
/*
    Purpose: creates empty composite feature.

    Input Arguments:
        p_mdl_handle - The model handle.

    Output Arguments:
        p_feat_handle - The created composite feature.

    Return Values:
        PRO_TK_NO_ERROR - The argument corresponds to a valid model.
        PRO_TK_BAD_INPUTS - The composite feature was created successfully.

*/


extern ProError ProMdlIsComposite (ProMdl  p_mdl_handle, 
                                   ProBoolean *p_is_composite);
/*
    Purpose: Check is model of kind Composite model

    Input Arguments:
        p_mdl_handle - The model handle.

    Output Arguments:
        p_is_composite - This is PRO_B_TRUE if the model is a Composite model; 
                         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 ProRosetteDefaultSet(ProFeature *rosette);
/*
    Purpose: Set specified rosette as default.

    Input Arguments:
        rosette - The rosette feature

    Output Arguments:
        none

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

*/

extern ProError ProRosetteDefaultGet(ProMdl composite_mdl, ProFeature *rosette);
/*
    Purpose: Get specified rosette as default.

    Input Arguments:
        composite_mdl - The composite model.

    Output Arguments:
        rosette - Default rosette feature.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully returned the information.
        PRO_TK_BAD_INPUTS - The input argument is invalid.
        PRO_TK_E_NOT_FOUND - No rosette found or no default is set.

*/


extern ProError ProCompositePlyVisit (ProSolid                  composite,
                                      ProModelitemVisitAction   action, 
                                      ProModelitemFilterAction  filter,
                                      ProAppData                appdata);
/*
    Purpose: Visits all the plies in the specified composite solid.

    Input Arguments:
        composite - The composite solid handle.
        action - The visiting function. If it returns anything other than 
                 PRO_TK_NO_ERROR, visiting stops.
        filter - The filter function. If NULL, all features in the specified 
                 solid are visited using the action function.
        appdata - The application data passed to the filter and action 
                  functions.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully visited all the plies.
        PRO_TK_E_NOT_FOUND - Either no ply exist, or they were all filtered out 
                             by the filter function.
        Other - Any other value is the value returned by the action function 
                (visiting stopped).

*/

extern ProError ProPlyColorGet(ProPly *ply, ProColor *color);
/*
    Purpose: Get color of ply

    Input Arguments:
        ply - ply

    Output Arguments:
        color - color

    Return Values:
        PRO_TK_NO_ERROR - The function successfully returned color.
        PRO_TK_BAD_INPUTS - invalid ply

*/


extern ProError ProPlyFeatureGet(ProPly *ply, ProFeature *feat);
/*
    Purpose: Get feature which created ply.

    Input Arguments:
        ply - ply

    Output Arguments:
        feat - feat

    Return Values:
        PRO_TK_NO_ERROR - The function successfully returned feature.
        PRO_TK_BAD_INPUTS - invalid ply

*/

PRO_END_C_DECLS


#endif  /* PROCOMPOSITE_H */