#ifndef PROVARIANTFEAT_H_
#define PROVARIANTFEAT_H_


/* Creo Parametric TOOLKIT declarations for Inheritance/Flexible feature related actions */

#include <ProObjects.h>
#include <ProParameter.h>
#include <ProReference.h>
#include <ProModelitem.h>
#include <ProAsmcomppath.h>



PRO_BEGIN_C_DECLS

typedef void* ProVariantref;

extern ProError ProVariantfeatMdlGet (ProFeature* feature, ProMdl* mdl);
/*
    Purpose: Obtains a special model pointer from an inheritance feature or 
             flexible component. This pointer is for use in accessing 
             properties that can be modified by the presence of an inheritance 
             feature or flexible component. Other functions will return an 
             error if provided with this pointer. To read or modify values not 
             accessible from this pointer, retrieve the parent model using the 
             model name and type using ProMdlRetrieve() or the equivalent. 
             Consult the Creo Parametric TOOLKIT User's Guide for details on 
             the functions that are supported by this pointer.

    Input Arguments:
        feature - The variant feature.

    Output Arguments:
        mdl - The inheritance feature model handle.

    Return Values:
        PRO_TK_NO_ERROR - The function succeeded.
        PRO_TK_BAD_INPUTS - One or arguments was invalid.

*/

extern ProError ProMdlIsVariantfeatMdl (ProMdl mdl, 
                                        ProBoolean* is_var_feat_mdl);
/*
    Purpose: Identifies if a model pointer is from an inheritance feature or 
             flexible component.

    Input Arguments:
        mdl - The model handle.

    Output Arguments:
        is_var_feat_mdl - PRO_B_TRUE if the model is obtained from a variant 
                          feature.

    Return Values:
        PRO_TK_NO_ERROR - The function succeeded.
        PRO_TK_BAD_INPUTS - One or arguments was invalid.

    See Also:
        ProVariantfeatMdlGet()
*/


extern ProError ProVariantfeatItemStandardize (ProFeature* variant_feature, 
                                               ProModelitem* varied_item);
/*
    Purpose: Removes a varied item from the inheritance feature or flexible 
             component.

    Input Arguments:
        variant_feature - The variant feature handle.
        varied_item - The item which is currently varied in the feature.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function succeeded.
        PRO_TK_BAD_INPUTS - One or more input arguments was invalid.
        PRO_TK_BAD_CONTEXT - The item is not varied in the feature.

*/


extern ProError ProVariantfeatItemCopyGet (ProFeature* feature, 
                                           ProModelitem* item, 
                                           ProBoolean* copy);
/*
    Purpose: Obtains the copy flag for a given item in the inheritance feature 
             or flexible component.

    Input Arguments:
        feature - The variant feature
        item - The item.

    Output Arguments:
        copy - Whether or not to copy the item into the variant feature. If 
               set, this overrides the "copy all" setting for the feature.

    Return Values:
        PRO_TK_NO_ERROR - The function succeeded.
        PRO_TK_BAD_INPUTS - One or more input arguments was invalid.
        PRO_TK_BAD_CONTEXT - The item is not varied in the feature.
        PRO_TK_E_NOT_FOUND - The copy flag is not set (so the behavior is 
                             governed by the feature's "copy all" flag).

*/

extern ProError ProVariantfeatItemCopySet (ProFeature* feature, 
                                           ProModelitem* item, 
                                           ProBoolean copy);
/*
    Purpose: Assigns the copy flag for a given item in the inheritance feature 
             or flexible component. After making a change using this function, 
             you should regenerate the feature's owner to completely update the 
             status of the item.

    Input Arguments:
        feature - The variant feature
        item - The item. If the item is not currently varied in the feature 
               this will force it to become varied.
        copy - Whether or not to copy the item into the variant feature. If 
               set, this overrides the "copy all" setting for the feature.

    Output Arguments:
        none

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

    See Also:
        ProSolidRegenerate()
*/

extern ProError ProVariantfeatItemCopyUnset (ProFeature* feature, 
                                             ProModelitem* item);
/*
    Purpose: Removes the copy flag for a given item in the inheritance feature 
             or flexible component.

    Input Arguments:
        feature - The variant feature
        item - The item.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function succeeded.
        PRO_TK_BAD_INPUTS - One or more input arguments was invalid.
        PRO_TK_BAD_CONTEXT - The item is not currently varied in the feature.

*/

extern ProError ProVariantfeatItemsVisit (ProFeature* feature, 
                                         ProModelitemVisitAction visit_action, 
                                         ProModelitemFilterAction filter_action, 
                                         ProAppData application_data);
/*
    Purpose: Visits the variant items (dimensions, features, annotations) owned 
             by an inheritance feature or flexible component. The dimension 
             handles will contain the variant feature model pointer, which has 
             limited access. For more details see ProVariantfeatMdlGet().

    Input Arguments:
        feature - The variant feature.
        visit_action - The visit action.
        filter_action - The filter action. Pass NULL to skip the filter.
        application_data - The application data passed to the filter and visit 
                           action. Can be NULL.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function succeeded.
        PRO_TK_BAD_INPUTS - One or arguments was invalid.
        PRO_TK_E_NOT_FOUND - No variant dimensions were found.
        Other - Returned by the visit action.

*/

extern ProError ProVariantfeatParamsVisit (ProFeature* feature, 
                                           ProParameterAction visit_action, 
                                           ProParameterFilter filter_action, 
                                           ProAppData application_data);
/*
    Purpose: Visits only the variant parameters owned by an inheritance feature 
             or flexible component. The parameter handles will contain the 
             variant feature model pointer, which has limited access. For more 
             details see ProVariantfeatMdlGet().

    Input Arguments:
        feature - The variant feature.
        visit_action - The visit action.
        filter_action - The filter action. Pass NULL to skip the filter.
        application_data - The application data passed to the filter and visit 
                           action. Can be NULL.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function succeeded.
        PRO_TK_BAD_INPUTS - One or arguments was invalid.
        PRO_TK_E_NOT_FOUND - No variant annotations were found.
        Other - Returned by the visit action.

*/

extern ProError ProVariantfeatParamStandardize (ProFeature* variant_feature, 
                                                ProParameter* varied_param);
/*
    Purpose: Removes a varied parameter from the inheritance feature or 
             flexible component.

    Input Arguments:
        variant_feature - The variant feature handle.
        varied_param - The parameter which is currently varied in the feature.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function succeeded.
        PRO_TK_BAD_INPUTS - One or more input arguments was invalid.
        PRO_TK_BAD_CONTEXT - The parameter is not varied in the feature.

*/

extern ProError ProVariantrefAlloc (ProReference original_ref, 
                                    ProReference replacement_ref, 
                                    int* feat_ids, ProVariantref* variant_ref);
/*
    Purpose: Allocates a handle used to describe a variant reference assigned 
             to a variant feature (like inheritance features).

    Input Arguments:
        original_ref - The initial reference handle.
        replacement_ref - The replacement reference handle.
        feat_ids - ProArray of feature ids (from the base model) which will be 
                   assigned this reference replacment action.

    Output Arguments:
        variant_ref - The variant reference handle.

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

*/

extern ProError ProVariantrefFree (ProVariantref variant_ref);
/*
    Purpose: Frees a handle used to describe a variant reference assigned to a 
             variant feature (like inheritance features).

    Input Arguments:
        variant_ref - The variant reference handle.

    Output Arguments:
        none

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

*/

extern ProError ProVariantrefProarrayFree (ProVariantref* variant_ref);
/*
    Purpose: Frees an array of handles used to describe a variant reference 
             assigned to a variant feature (like inheritance features).

    Input Arguments:
        variant_ref - The variant reference handle.

    Output Arguments:
        none

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

*/

extern ProError ProVariantrefOriginalrefGet (ProVariantref variant_ref, 
                                             ProReference* original_ref);
/*
    Purpose: Obtains the original reference (to be replaced).

    Input Arguments:
        variant_ref - The variant reference handle.

    Output Arguments:
        original_ref - The original reference.

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

*/

extern ProError ProVariantrefOriginalrefSet (ProVariantref variant_ref, 
                                             ProReference original_ref);
/*
    Purpose: Assigns the original reference (to be replaced).

    Input Arguments:
        variant_ref - The variant reference handle.
        original_ref - The original reference.

    Output Arguments:
        none

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

*/

extern ProError ProVariantrefReplacementrefGet (ProVariantref variant_ref, 
                                                ProReference* replacement_ref);
/*
    Purpose: Obtains the replacement reference (which replaces the original 
             reference in this variant feature).

    Input Arguments:
        variant_ref - The variant reference handle.

    Output Arguments:
        replacement_ref - The replacement reference handle.

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

*/

extern ProError ProVariantrefReplacementrefSet (ProVariantref variant_ref, 
                                                ProReference replacement_ref);
/*
    Purpose: Assigns the replacement reference (which replaces the original 
             reference in this variant feature).

    Input Arguments:
        variant_ref - The variant reference handle.
        replacement_ref - The replacement reference handle.

    Output Arguments:
        none

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

*/

extern ProError ProVariantrefFeatidsGet (ProVariantref variant_ref, 
                                         int** feat_ids);
/*
    Purpose: Obtains an array of the feature ids (taken from the base model) 
             which will be assigned the reference replacement.

    Input Arguments:
        variant_ref - The variant reference handle.

    Output Arguments:
        feat_ids - ProArray of feature ids (in the base model). Free this using 
                   ProArrayFree().

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

*/

extern ProError ProVariantrefFeatidsSet (ProVariantref variant_ref, 
                                         int* feat_ids);
/*
    Purpose: Obtains an array of the feature ids (taken from the base model) 
             which will be assigned the reference replacement. Note: It is not 
             required that the features listed actually use the replacement 
             reference. If they do, this rule will be applied.

    Input Arguments:
        variant_ref - The variant reference handle.
        feat_ids - ProArray of feature ids (in the base model).

    Output Arguments:
        none

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

*/

extern ProError ProVariantfeatVariantrefsGet (ProFeature* variant_feat, 
                                              ProVariantref** variant_refs);
/*
    Purpose: Obtains the variant reference assignments stored by this variant 
             feature (inheritance feature).

    Input Arguments:
        variant_feat - The variant feature handle.

    Output Arguments:
        variant_refs - ProArray of the variant reference assignments for the 
                       feature. Free this using ProVariantrefProarrayFree().

    Return Values:
        PRO_TK_NO_ERROR - The function succeeded.
        PRO_TK_BAD_INPUTS - One or more input arguments was invalid.
        PRO_TK_E_NOT_FOUND - No variant references are assigned.

*/

extern ProError ProVariantfeatVariantrefsSet (ProFeature* variant_feat, 
                                              ProVariantref* variant_refs);
/*
    Purpose: Assigns the variant reference assignments stored by this variant 
             feature (inheritance feature).

    Input Arguments:
        variant_feat - The variant feature handle.
        variant_refs - ProArray of the variant reference assignments for the 
                       feature.

    Output Arguments:
        none

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

*/


extern ProError ProDatasharingfeatCopiedgeomitemFind(
		 ProFeature* p_datasharing_feature,
		 ProAsmcomppath *p_orig_path,
		 ProGeomitem *p_orig_item,
		 ProGeomitem *p_copied_item);
/*
    Purpose: Retrieves the geometry item owned by the data sharing feature that 
             is actually the copy of the indicated geometry item in the parent 
             model. Currently, this function supports Inheritance, Merge and 
             Cutout features only. 

    Licensing Requirement:
        UNRECOGNIZED

    Input Arguments:
        p_datasharing_feature - the data sharing feature.
        p_orig_path - The component path from the top level assembly to the 
                      subcomponent owning the geometry. Pass NULL if the 
                      geometry is owned by the top level model in the 
                      datasharing feature.
        p_orig_item - The Geometry item in the original model.

    Output Arguments:
        p_copied_item - The geometry item owned by the data sharing feature 
                        that is a copy of the original item.

    Return Values:
        PRO_TK_NO_ERROR - The function succeeded.
        PRO_TK_BAD_INPUTS - One or more arguments was invalid.
        PRO_TK_BAD_CONTEXT - The indicated geometry item is not copied by the 
                             data sharing feature.
        PRO_TK_INVALID_TYPE - Feature type is unsupported.

*/

extern ProError ProMdlVariantfeatAsmcomppathGet (ProMdl mdl,
                                                 ProAsmcomppath *p_handle);
/*
    Purpose: Obtains a special model pointer from an inheritance feature or 
             flexible component. This pointer is for use in accessing 
             properties that can be modified by the presence of an inheritance 
             feature or flexible component. Other functions will return an 
             error if provided with this pointer. To read or modify values not 
             accessible from this pointer, retrieve the parent model using the 
             model name and type using ProMdlRetrieve() or the equivalent. 
             Consult the Creo Parametric TOOLKIT User's Guide for details on 
             the functions that are supported by this pointer.

    Input Arguments:
        mdl - The inheritance feature model handle.

    Output Arguments:
        p_handle - The component path from the top level inheritance feature or 
                   to the flexible component model owner.

    Return Values:
        PRO_TK_NO_ERROR - The function succeeded.
        PRO_TK_BAD_INPUTS - One or arguments was invalid.

*/

extern ProError ProModelitemVariantfeatAsmcomppathGet (ProModelitem *item,
                                                      ProAsmcomppath *p_handle);
/*
    Purpose: Obtains the component path of varied item model item of 
             inheritance feature or flexible component

    Input Arguments:
        item - Varied item model item.

    Output Arguments:
        p_handle - The component path from the top level inheritance feature or 
                   to the flexible component model owner.

    Return Values:
        PRO_TK_NO_ERROR - The function succeeded.
        PRO_TK_BAD_INPUTS - One or arguments was invalid.

*/

extern ProError ProDatasharingfeatCopiedAnnotFind(
                 ProFeature     *p_datasharing_feature,
                 ProAsmcomppath *p_orig_path,
                 ProAnnotation  *p_orig_item,
                 ProAnnotation  *p_copied_item);
/*
    Purpose: Retrieves the annotation item owned by the data sharing feature 
             that is actually the copy of the indicated annotation item in the 
             parent model. Currently, this function supports Inheritance, Merge 
             and Cutout features only. 

    Licensing Requirement:
        UNRECOGNIZED

    Input Arguments:
        p_datasharing_feature - the data sharing feature.
        p_orig_path - The component path from the top level assembly to the 
                      subcomponent owning the annotation. Pass NULL if the 
                      annotation is owned by the top level model in the 
                      datasharing feature.
        p_orig_item - The Annotation item in the original model.

    Output Arguments:
        p_copied_item - The annotation item owned by the data sharing feature 
                        that is a copy of the original item.

    Return Values:
        PRO_TK_NO_ERROR - The function succeeded.
        PRO_TK_BAD_INPUTS - One or more arguments was invalid.
        PRO_TK_BAD_CONTEXT - The indicated annotation item is not copied by the 
                             data sharing feature.
        PRO_TK_INVALID_TYPE - Feature type is unsupported.

*/
PRO_END_C_DECLS
#endif  /* PROVARIANTFEAT_H_ */