#ifndef PROPARAMETER_H
#define PROPARAMETER_H



#include 	<ProObjects.h>
#include  <ProMdlUnits.h>
#include	<ProParamval.h>

PRO_BEGIN_C_DECLS

typedef enum param_sel_context 
{
  PRO_PARAMSELECT_ANY                     = -1,
  PRO_PARAMSELECT_MODEL                   = 1<<0,
  PRO_PARAMSELECT_PART                    = 1<<1,
  PRO_PARAMSELECT_ASM                     = 1<<2,
  PRO_PARAMSELECT_FEATURE                 = 1<<3,
  PRO_PARAMSELECT_EDGE                    = 1<<4,
  PRO_PARAMSELECT_SURFACE                 = 1<<5,
  PRO_PARAMSELECT_QUILT                   = 1<<6,
  PRO_PARAMSELECT_CURVE                   = 1<<7,
  PRO_PARAMSELECT_COMPOSITE_CURVE         = 1<<8,
  PRO_PARAMSELECT_INHERITED               = 1<<9,
  PRO_PARAMSELECT_SKELETON                = 1<<10,
  PRO_PARAMSELECT_COMPONENT               = 1<<11,
  PRO_PARAMSELECT_ALLOW_SUBITEM_SELECTION = 1<<12,
  PRO_PARAMSELECT_SENSOR                  = 1<<13  /* for internal use */
} ProParameterSelectContext;

typedef enum 
{
  PRO_PARAM_UNLIMITED             = -1, 
  PRO_PARAM_LESS_THAN             = 0,
  PRO_PARAM_LESS_THAN_OR_EQUAL    = 1,
  PRO_PARAM_GREATER_THAN          = 2,
  PRO_PARAM_GREATER_THAN_OR_EQUAL = 3
} ProParamLimitType;

typedef struct 
{
  ProParamLimitType type;
  ProParamvalue     value;
} ProParamLimit;

typedef enum
{
  PRO_PARAMTABLE_EXPORT_TXT,
  PRO_PARAMTABLE_EXPORT_CSV,
  PRO_PARAMTABLE_EXPORT_XML
} ProParamTableExportType;

typedef enum
{
   PRO_PARAM_NAME_COLUMN            = 1 << 0, 
   PRO_PARAM_TYPE_COLUMN            = 1 << 1,
   PRO_PARAM_VALUE_COLUMN           = 1 << 2,
   PRO_PARAM_DESIGNATE_COLUMN       = 1 << 3,
   PRO_PARAM_ACCESS_COLUMN          = 1 << 4,
   PRO_PARAM_SOURCE_COLUMN          = 1 << 5,
   PRO_PARAM_DESCRIPTION_COLUMN     = 1 << 6,
   PRO_PARAM_COMPBASED_COLUMN       = 1 << 7,
   PRO_PARAM_REPORTINBOM_COLUMN     = 1 << 8,
   PRO_PARAM_RESTRICTED_COLUMN      = 1 << 9,
   PRO_PARAM_UNIT_COLUMN            = 1 << 10,
   PRO_PARAM_VARIABLE_COLUMN        = 1 << 11,
   PRO_PARAM_APPLICABILITY_COLUMN   = 1 << 12,
   PRO_PARAM_HYPERLINK_COLUMN       = 1 << 13,
   PRO_PARAM_OWNER_COLUMN           = 1 << 14,
   PRO_PARAM_MODEL_COLUMN           = 1 << 15,
   PRO_PARAM_OWNER_TYPE_COLUMN      = 1 << 16,
   PRO_PARAM_AE_TYPE_COLUMN         = 1 << 17,
   PRO_PARAM_UNIT_QTYPE_COLUMN      = 1 << 18
   /* (1 << 19) is used */  
} ProParamColumn;

typedef enum
{  
   PRO_PARAMLOCKSTATUS_UNLOCKED     = 0,
   PRO_PARAMLOCKSTATUS_LIMITED      = 1,
   PRO_PARAMLOCKSTATUS_LOCKED       = 2
} ProLockstatus;

typedef enum
{
  PRO_PARAM_INIT_ATTR_NONE          = 0,
  PRO_PARAM_DIMENSION_NAME_CHECK    = 1 << 0
} ProParamInitFlags;


/* Prototype for the action function used by the visiting function */
 
typedef ProError (*ProParameterAction) ( ProParameter *handle, 
                                         ProError status, 
                                         ProAppData data);
/*
    Purpose: This is a generic function for visiting parameters.

    Input Arguments:
        handle - The handle to the parameter.
        status - The status returned from the filter function if the filter 
                 function is not NULL. Otherwise, this is PRO_TK_NO_ERROR.
        data - The application data passed to the function 
               <b>ProParameterVisit()</b>.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - Continue to the next parameter.
        Other - Any other value causes the function <b>ProParameterVisit()</b> 
                to return.

*/

/* Prototype for the filter function used by the visiting function */

typedef ProError (*ProParameterFilter) ( ProParameter *handle, 
                                         ProAppData data );
/*
    Purpose: This is a generic function for visiting parameters.

    Input Arguments:
        handle - The handle to the parameter
        data - The application data passed to the function 
               <b>ProParameterVisit()</b>

    Output Arguments:
        none

    Return Values:
        PRO_TK_CONTINUE - Skips over the parameter (the action function is not 
                          called).
        Other - Passes this status to the action function, if present.

*/

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

extern ProError ProParameterInit (ProModelitem *owner,
                                  ProName       name, 
                                  ProParameter *param);
/*
    Purpose: Initializes a <i>ProParameter</i> data structure.

    Input Arguments:
        owner - The solid to which the <i>ProParameter</i> belongs
        name - The name of the <i>ProParameter</i>

    Output Arguments:
        param - The initialized <i>ProParameter</i> handle

    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.
        PRO_TK_BAD_CONTEXT - The owner is nonexistent.
        PRO_TK_E_NOT_FOUND - The parameter was not found within the owner.

*/


extern ProError ProParameterWithUnitsCreate (ProModelitem  *owner, 
                                             ProName        name, 
                                             ProParamvalue *proval,
                                             ProUnititem   *units, 
                                             ProParameter  *param);
/*
    Purpose: Adds the specified parameter to the database and initializes the 
             handle. The parameter will be created with units.

    Input Arguments:
        owner - The owner (a model item or solid)
        name - The name of the <i>ProParameter</i>
        proval - The initial data the <i>ProParameter</i> will hold.
        units - The units assigned to this parameter. To create a parameter 
                without units, pass NULL.

    Output Arguments:
        param - The handle to create and initialize

    Return Values:
        PRO_TK_NO_ERROR - The function successfully added the parameter.
        PRO_TK_BAD_INPUTS - One or more of the input arguments are invalid.
        PRO_TK_BAD_CONTEXT - The owner is nonexistent.
        PRO_TK_E_FOUND - The specified parameter already exists.
        PRO_TK_GENERAL_ERROR - The function could not add the parameter to the 
                               database.
        PRO_TK_NOT_VALID - The specified parameter is invalid.

    See Also:
        ProParameterCreate()
*/

extern ProError ProParameterDelete (ProParameter  *param);
/*
    Purpose: Deletes the specified <i>ProParameter</i> from the database.

    Input Arguments:
        param - The <i>ProParameter</i> to delete

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully deleted the parameter.
        PRO_TK_E_NOT_FOUND - The owner was not found.
        PRO_TK_GENERAL_ERROR - The parameter was not found, or the function 
                               could not perform the action.

*/


extern ProError ProParameterValueWithUnitsSet (ProParameter   *param, 
                                               ProParamvalue  *proval,
                                               ProUnititem    *units);
/*
    Purpose: Sets the value given with units of an existing 
             <i>ProParameter</i>.

    Input Arguments:
        param - The handle of the parameter to set
        proval - The new value. The value assumed to be in the units specified 
                 by units argument (when the units argument is not NULL) or in 
                 the units of the owner model, when argument units is NULL.
        units - The new units. The units must be the same quantity type as the 
                parameter's units (i.e. if the units are "inch", a value can be 
                expressed in "cm"). Can be NULL. If you pass NULL, the function 
                will assume the units of the owner model.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully set the value and units.
        PRO_TK_E_NOT_FOUND - The owner was not found.
        PRO_TK_BAD_INPUTS - One or more arguments was invalid.
        PRO_TK_INVALID_TYPE - The unit type provided does not match the units 
                              of the parameter.
        PRO_TK_GENERAL_ERROR - The parameter was not found, or the function 
                               could not perform the action.

*/

extern ProError ProParameterScaledvalueSet (ProParameter   *param, 
                                            ProParamvalue  *proval,
                                            ProUnititem    *units);
/*
    Purpose: Sets the parameter value in terms of the units provided, instead 
             of using the units of the owner model.

    Input Arguments:
        param - The handle of the parameter to set
        proval - The value.
        units - The units in which the value is expressed. The units must be 
                the same quantity type as the parameter's units (i.e. if the 
                units are "inch", a value can be expressed in "cm"). Can be 
                NULL.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully set the value.
        PRO_TK_E_NOT_FOUND - The owner was not found.
        PRO_TK_BAD_INPUTS - One or more arguments was invalid.
        PRO_TK_INVALID_TYPE - The unit type provided does not match the units 
                              of the parameter.
        PRO_TK_GENERAL_ERROR - The parameter was not found, or the function 
                               could not perform the action.

*/


extern ProError ProParameterValueWithUnitsGet (ProParameter   *param, 
                                               ProParamvalue  *proval,
                                               ProUnititem *units);
/*
    Purpose: Retrieves the value and units of the specified 
             <i>ProParameter</i>.

    Input Arguments:
        param - The handle to the parameter to query

    Output Arguments:
        proval - The value currently held in the <i>ProParameter</i> The value 
                 is assumed to be in the specified units. Pass units as NULL to 
                 get value in units of owner model
        units - The units in which the value is expressed. Pass NULL if unit is 
                not required. If none found, an empty string will be returned.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the information. 
                          Parameter could be unitless.
        PRO_TK_E_NOT_FOUND - The owner was not found.
        PRO_TK_BAD_INPUTS - One or more arguments was invalid.
        PRO_TK_GENERAL_ERROR - The parameter was not found, or the function 
                               could not perform the action.

*/

extern ProError ProParameterScaledvalueGet (ProParameter   *param, 
                                            ProParamvalue  *proval);
/*
    Purpose: Gets the parameter value in the units of the parameter, instead of 
             the units of the owner model.

    Input Arguments:
        param - The handle to the parameter to query

    Output Arguments:
        proval - The value.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the information.
        PRO_TK_BAD_INPUTS - One or more arguments are invalid.
        PRO_TK_E_NOT_FOUND - The owner was not found.
        PRO_TK_GENERAL_ERROR - The parameter was not found, or the function 
                               could not perform the action.

    See Also:
        ProParameterUnitsGet()
*/

extern ProError ProParameterValueReset (ProParameter *param);
/*
    Purpose: Resets the value of the <i>ProParameter</i> to the value it had 
             before it was last set.

    Input Arguments:
        param - The handle of the parameter to reset

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully reset the value.
        PRO_TK_E_NOT_FOUND - The owner was not found.
        PRO_TK_GENERAL_ERROR - The parameter was not found, or the function 
                               could not perform the action.

*/

extern ProError ProParameterIsModified (ProParameter   *param,
                                        ProBoolean     *r_is_modified);
/*
    Purpose: Determines whether the specified parameter has been modified.
             <p> NOTE: 
             <p> A parameter is said to be "modified" if the value has been 
             changed but the parameter's owner has not yet been regenerated. 
             This function can succeed only for solid models.

    Input Arguments:
        param - The handle to the parameter to query.

    Output Arguments:
        r_is_modified - This is PRO_B_TRUE if the specified parameter is 
                        modified.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the information.
        PRO_TK_E_NOT_FOUND - The owner was not found.
        PRO_TK_GENERAL_ERROR - The parameter was not found, or the function 
                               could not perform the action.

*/

extern ProError ProParameterVisit (ProModelitem       *owner, 
                                   ProParameterFilter  filter,
                                   ProParameterAction  action, 
                                   ProAppData          data);
/*
    Purpose: Performs a user-defined action on each parameter. <B>Note:</B> 
             This function does not visit mass properties parameters.

    Input Arguments:
        owner - The owner of the parameters. For model parameters use the 
                function <b>ProMdlToModelitem</b>.
        filter - The filter function. If NULL, all parameters are are visited 
                 using the action function.
        action - The action to perform on each <i>ProParameter</i>. If the 
                 function returns anything other than PRO_TK_NO_ERROR, visiting 
                 ends.
        data - 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 parameters.
        PRO_TK_BAD_INPUTS - One or more of the input arguments are invalid, or 
                            the action function is PRO_NO_FUNCTION.
        PRO_TK_GENERAL_ERROR - The owner was not found.
        PRO_TK_E_NOT_FOUND - No parameters were found.
        Other - Any other value is the value returned by the action function 
                (visiting stopped).

*/

extern ProError ProParameterSelect (ProModelitem    *owner,
                                    ProMdl           top_model,
                                    int              context,
                                    ProBoolean       select_multiple,
                                    wchar_t         *button_label,
                                    ProParameter    *parameter,
                                    ProParameter   **multi_parameters);
/*
    Purpose: Prompts the user to select one or more parameters from the 
             parameter dialog in Creo Parametric. 
             <p><b>Note: </b>The top model from which the parameters will be 
             selected must be displayed in the current window.

    Input Arguments:
        owner - The owner of the parameters to be selected. May be NULL if the 
                parameter should be selected by context.
        top_model - The top level model from which parameters will be selected.
        context - A bitmask containing the context of parameter selection 
                  (Members of ProParameterSelectContext). Used only if "owner" 
                  is NULL.
        select_multiple - PRO_B_TRUE to allow multiple selections. PRO_B_FALSE 
                          otherwise.
        button_label - Label for select button, or NULL to use default label.

    Output Arguments:
        parameter - If select_multiple is PRO_B_FALSE should contain the 
                    selected parameter. NULL should be passed if 
                    select_multiple is PRO_B_TRUE.
        multi_parameters - If select_multiple is PRO_B_TRUE should contain 
                           ProArray of selected parameters. ProArrayFree should 
                           be used to free this array.. NULL passed if 
                           select_multiple is PRO_B_FALSE.

    Return Values:
        PRO_TK_NO_ERROR - The user selected the parameter(s).
        PRO_TK_BAD_CONTEXT - The owner is invalid or not found.
        PRO_TK_E_NOT_FOUND - The owner does not contain parameteers.
        PRO_TK_USER_ABORT - The user aborted the selection.
        PRO_TK_INVALID_TYPE - Invalid context for top_model argument.
        PRO_TK_BAD_INPUTS - One or more arguments was invalid.

*/

extern ProError ProParameterDesignationAdd (ProParameter* param);
/*
    Purpose: Adds the designation status for the specified model parameter, 
             making the parameter visible to PTC-provided PDM solutions.

    Input Arguments:
        param - The parameter to add

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully added the parameter.
        PRO_TK_BAD_INPUTS - The input argument is invalid.
        PRO_TK_E_FOUND - The specified parameter already exists.

*/

extern ProError ProParameterDesignationVerify (ProParameter* param,
                                                          ProBoolean* p_exist);
/*
    Purpose: Obtains the specified model parameter's designation status, which 
             determines whether the parameter is visible to PTC-provided PDM 
             solutions.

    Input Arguments:
        param - The parameter to be verified.

    Output Arguments:
        p_exist - If the parameter exists, this is PRO_B_TRUE; otherwise, this 
                  is PRO_B_FALSE.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully verified the parameter.
        PRO_TK_BAD_INPUTS - The input argument is invalid.

*/

extern ProError ProParameterDesignationRemove (ProParameter* param);
/*
    Purpose: Removes the specified model parameter's designation status, making 
             the parameter invisible to PTC-provided PDM solutions.

    Input Arguments:
        param - The parameter to be removed

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully removed the parameter.
        PRO_TK_BAD_INPUTS - The input argument is invalid.
        PRO_TK_E_NOT_FOUND - The specified parameter was not found.

*/


typedef ProError (*ProParameterCreateWithUnitsPreAction)
                                        (ProModelitem   *param_owner,
                                         ProName         param_name,
                                         ProUnititem    *units,
                                         ProParamvalue  *param_value);
/*
    Purpose: This is the notification function called before a parameter is 
             created.
             <p> This function is to be supplied by the user by calling 
             <b>ProNotificationSet()</b> with the notify type 
             PRO_PARAM_CREATE_W_UNITS_PRE.

    Input Arguments:
        param_owner - The model item handle of the parameter owner
        param_name - The name of the parameter to be created
        units - The units of the value to be set
        param_value - The value of this parameter

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - Proceed with parameter creation.
        Other - Error encountered. Abort parameter creation.

    See Also:
        ProNotificationSet()
*/


typedef ProError (*ProParameterModifyWithUnitsPreAction)
                             (ProParameter   *new_param,
                              ProParamvalue  *new_value,
                              ProUnititem    *new_units,
                              ProParamvalue  *old_value,
                              ProUnititem    *old_units );
/*
    Purpose: This is the notification function called before a parameter is 
             modified.
             <p> This function is to be supplied by the user by calling 
             <b>ProNotificationSet()</b> with the notify type 
             PRO_PARAM_MODIFY_W_UNITS_PRE.

    Input Arguments:
        new_param - The modified parameter.
        new_value - The value of the new parameter.
        new_units - The units of the new value.
        old_value - The value of the parameter before it was modified.
        old_units - The units of the value before it was modified.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - Proceed with the parameter modification.
        Other - Error encountered. Abort parameter modifiction.

    See Also:
        ProNotificationSet()
*/

typedef ProError (*ProParameterDeletePreAction) (ProParameter   *param_handle);
/*
    Purpose: This is the notification function called before a parameter is 
             deleted.
             <p> This function is to be supplied by the user by calling 
             <b>ProNotificationSet()</b> with the notify type 
             PRO_PARAM_DELETE_PRE.

    Input Arguments:
        param_handle - The parameter to be deleted

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - Proceed with parameter deletion.
        Other - Error encountered. Abort parameter deletion.

    See Also:
        ProNoticationSet()
*/

extern ProError ProParameterUnitsGet (ProParameter* param, ProUnititem* units);
/*
    Purpose: Gets the units assigned to a parameter.

    Input Arguments:
        param - The parameter.

    Output Arguments:
        units - The units.

    Return Values:
        PRO_TK_NO_ERROR - The function succeeded.
        PRO_TK_BAD_INPUTS - One or more arguments was invalid.
        PRO_TK_E_NOT_FOUND - The parameter is unitless.

*/

extern ProError ProParameterUnitsAssign (ProParameter   *param, 
                                         ProUnititem    *units);
/*
    Purpose: Sets the units assigned to a parameter.

    Input Arguments:
        param - The parameter, could not be NULL.
        units - The units.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function succeeded.
        PRO_TK_BAD_INPUTS - One or more arguments was invalid.
        PRO_TK_E_NOT_FOUND - The parameter is unitless.

*/

extern ProError ProParameterIsEnumerated (ProParameter   *param, 
                                          ProBoolean     *is_enumerated,
                                          ProParamvalue **valid_values);
/*
    Purpose: Identifies if a parameter is enumerated, and provides the values 
             that may be assigned to it.

    Input Arguments:
        param - The parameter.

    Output Arguments:
        is_enumerated - PRO_B_TRUE if the parameter is enumerated, PRO_B_FALSE 
                        if it is not.
        valid_values - ProArray of values that may be assigned to this 
                       parameter. Free this output using ProArrayFree(). Pass 
                       NULL if you are not interested in this output argument.

    Return Values:
        PRO_TK_NO_ERRORS - The function succeded.
        PRO_TK_BAD_INPUTS - One or more arguments is invalid.

*/

extern ProError ProParameterRangeGet (ProParameter    *param, 
                                      ProBoolean      *has_range,
                                      ProParamLimit   *minimum,
                                      ProParamLimit   *maximum);
/*
    Purpose: Identifies if a parameter's value is restricted to a certain 
             range.

    Input Arguments:
        param - The parameter.

    Output Arguments:
        has_range - PRO_B_TRUE if the parameter is restricted by range, 
                    PRO_B_FALSE if it is not.
        minimum - The minimum value for this parameter. Pass NULL if not 
                  interested in actual value.
        maximum - The maximum value for this parameter. Pass NULL if not 
                  interested in actual value.

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

*/


/* ProParameter.h */
typedef struct pro_param_table_set   *ProParamtableSet;   
typedef struct pro_param_table_entry *ProParamtableEntry; 

extern ProError ProParamtablesetEntriesGet (ProParamtableSet     set,
                                            ProParamtableEntry **entry_array);
/*
    Purpose: Obtains the entries that are contained in this parameter table 
             set.

    Input Arguments:
        set - The parameter table set.

    Output Arguments:
        entry_array - ProArray of table entries for the parameter table set.

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

*/

extern ProError ProParamtablesetTablepathGet (ProParamtableSet   set,
                                              ProPath            table_path);
/*
    Purpose: Obtains the name of the table that owns this parameter table set. 
             If the set is loaded from a certain table file, this is the full 
             path. If the set has been stored in the model directly, this is 
             the table name.

    Input Arguments:
        set - The parameter table set.

    Output Arguments:
        table_path - The name of the table.

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

*/

extern ProError ProParamtablesetLabelGet (ProParamtableSet   set,
                                          ProName            label);
/*
    Purpose: Obtains the set label for a given parameter table set, if it 
             exists.

    Input Arguments:
        set - The parameter table set.

    Output Arguments:
        label - The set label.

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

*/

extern ProError ProParamtablesetFree (ProParamtableSet   set);
/*
    Purpose: Frees a parameter table set.

    Input Arguments:
        set - The parameter table set.

    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 ProParamtablesetProarrayFree (ProParamtableSet *set_array);
/*
    Purpose: Frees an array of parameter table sets.

    Input Arguments:
        set_array - ProArray of parameter table sets.

    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 ProParamtableentryValueGet (ProParamtableEntry  entry,
                                            ProParamvalue      *value);
/*
    Purpose: Obtains the value for the parameter in this table set. If the 
             parameter also has a range applied, this is the default value for 
             the parameter.

    Input Arguments:
        entry - The parameter table entry.

    Output Arguments:
        value - The value for the parameter int this table set.

    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 - The parameter is assigned the null value in this 
                             table set.

*/

extern ProError ProParamtableentryRangeGet (ProParamtableEntry   entry,
                                            ProParamLimit       *minimum,
                                            ProParamLimit       *maximum);
/*
    Purpose: Obtains the permitted range for the parameter in this table set, 
             if one is assigned.

    Input Arguments:
        entry - The parameter table entry.

    Output Arguments:
        minimum - The minimum value for the parameter, as enforced in this 
                  parameter set.
        maximum - The maximum value for the parameter, as enforced in this 
                  parameter set.

    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 range is assigned to this parameter.

*/

extern ProError ProParamtableentryNameGet (ProParamtableEntry   entry,
                                           ProName              name);
/*
    Purpose: Obtains the name for the parameter in this table set.

    Input Arguments:
        entry - The parameter table entry.

    Output Arguments:
        name - The name for the parameter in this table set.

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

*/

extern ProError ProParamtableentryProarrayFree (ProParamtableEntry *entry_array);
/*
    Purpose: Frees an array of parameter table entries.

    Input Arguments:
        entry_array - ProArray of table entries.

    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 ProParameterTablesetGet (ProParameter     *param,
                                         ProParamtableSet *table_set);
/*
    Purpose: Obtains the parameter table set that this parameter is governed 
             by.

    Input Arguments:
        param - The parameter.

    Output Arguments:
        table_set - The parameter table set.

    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 - The parameter is not governed by a parameter table 
                             set.

*/

extern ProError ProParamtablesetApply (ProModelitem      *owner,
                                       ProParamtableSet   set);
/*
    Purpose: Assigns this parameter set to the given parameter owner. 
             Parameters called by the set will be created or modified, as 
             appropriate. The parameter values will be set to the default 
             values. This function does not perform a regeneration.

    Input Arguments:
        owner - The owner for the parameter set.
        set - The parameter table set.

    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_E_NOT_FOUND - The parameter owner already has one or more 
                             required parameters defined and they are not 
                             driven by this table.

*/

extern ProError ProParameterDescriptionGet (ProParameter  *param,
                                            wchar_t      **description);
/*
    Purpose: Obtains the parameter's description .

    Input Arguments:
        param - The parameter.

    Output Arguments:
        description - The parameter description.

    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 - The parameter's description is not set.

*/
    
extern ProError ProParameterDescriptionSet (ProParameter  *param,
                                            wchar_t       *description);
/*
    Purpose: Assigns the parameter's description .

    Input Arguments:
        param - The parameter.
        description - The parameter description.

    Output Arguments:
        none

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

*/


typedef ProError (*ProParameterCreatePostAction) (ProParameter *param);
/*
    Purpose: This is the notification function prototype for a function called 
             after a parameter has been created (actions of type 
             PRO_PARAM_CREATE_POST).

    Input Arguments:
        param - The created parameter.

    Output Arguments:
        none

    Return Values:
        Any other value - Return values are not interpreted by Creo Parametric.

*/


typedef ProError (*ProParameterModifyWithUnitsPostAction)
                             (ProParameter   *new_param,
                              ProParamvalue  *new_value,
                              ProUnititem    *new_units,
                              ProParamvalue  *old_value,
                              ProUnititem    *old_units );
/*
    Purpose: This is the notification function prototype for a function called 
             after a parameter has been modified (actions of type 
             PRO_PARAM_MODIFY_W_UNITS_POST).

    Input Arguments:
        new_param - The modified parameter.
        new_value - The value of the new parameter.
        new_units - The units of the new value.
        old_value - The value of the parameter before it was modified.
        old_units - The units of the value before it was modified.

    Output Arguments:
        none

    Return Values:
        Any other value - Return values are not interpreted by Creo Parametric.

*/


typedef ProError (*ProParameterDeleteWithUnitsPostAction)
                                        (ProModelitem  *owner,
                                         ProName        name,
                                         ProUnititem   *units,
                                         ProParamvalue *old_value);
/*
    Purpose: This is the notification function prototype for a function called 
             after a parameter has been deleted (actions of type 
             PRO_PARAM_DELETE_W_UNITS_POST).

    Input Arguments:
        owner - The owner of the just-deleted parameter.
        name - The name of the parameter that was deleted.
        units - The units of the value of the parameter.
        old_value - The value of the parameter (before it was deleted).

    Output Arguments:
        none

    Return Values:
        Any other value - Return values are not interpreted by Creo Parametric.

*/

extern ProError ProParameterReorder (ProParameter* param_to_reorder, 
                                     ProParameter* param_before);
/*
    Purpose: Reorders the given parameter to come just after the indicated 
             parameter.

    Input Arguments:
        param_to_reorder - The parameter to reorder.
        param_before - The parameter to be just before the reordered parameter. 
                       If NULL, the reordered parameter is moved to the first 
                       position in the parameter list.

    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 - Parameter 'param_before' does not have the same 
                             owner as the parameter to be reordered.
        PRO_TK_NO_LICENSE - No license is available for this functionality.

*/


extern ProError ProMdlParamtablesetsCollect (ProMdl             mdl,
                                        ProParamtableSet **param_table_sets);
/*
    Purpose: Obtains an array of all of the table sets that are available for 
             use in the given model. This includes all sets that are loaded 
             from files setup in this session, and any sets that were 
             previously stored in the model.

    Input Arguments:
        mdl - The model.

    Output Arguments:
        param_table_sets - ProArray of the table sets that are available for 
                           use in this model. Free this using 
                           ProParamtablesetProarrayFree().

    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 parameter table sets are available for this 
                             model.

*/


extern ProError ProParameterTableExport (ProModelitem           *owner,
                                         ProMdl                  top_model,
                                         int                     context,
                                         ProParamTableExportType file_type,
                                         ProPath                 file_path,
                                         ProParamColumn          column_list);
/*
    Purpose: Exports a file containing information from the parameter table in 
             Creo Parametric in the CSV or TXT format.

    Input Arguments:
        owner - The owner of the parameters to be exported. May be NULL if the 
                parameter should be selected by context.
        top_model - The top level model from which parameters will be exported.
        context - A bitmask containing the context of parameters to list in the 
                  export. (Members of ProParameterSelectContext). Used only if 
                  "owner" is NULL. The following options are supported: 
                  <UL><LI>PRO_PARAMSELECT_ALLOW_SUBITEM_SELECTION alone, all 
                  parameters of all subitems of top_model will be exported. 
                  <LI>PRO_PARAMSELECT_ALLOW_SUBITEM_SELECTION and other 
                  contexts, only the indicated contexts' parameters will be 
                  exported. <LI>PRO_PARAMSELECT_MODEL, PRO_PARAMSELECT_PART or 
                  PRO_PARAMSELECT_ASM: all model level parameters in top model 
                  will be exported. </UL> No other combination is permitted.
        file_type - The type of export file to create. CSV format will export 
                    only local parameters Use TXT format to export full list of 
                    parameters
        file_path - Full path to the file to export (including name and 
                    extension).
        column_list - Bitmask containing one or more columns to include in the 
                      exported file. This applies only when the file is being 
                      exported in the CSV format, and not when the file is 
                      being exported in the TXT format (where the columns 
                      exported will match the columns and options set by the 
                      user in the active session, in accordance with the 
                      behavior of File->Export in the Parameter dialog box).

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function succeeded.
        PRO_TK_BAD_CONTEXT - The owner is invalid or not found and/or
        Design Test Mode is active - the function is not available in this mode
        PRO_TK_E_NOT_FOUND - The owner does not contain parameters.
        PRO_TK_CANT_WRITE - Creo Parametric could not write to the file path 
                            specified.
        PRO_TK_INVALID_TYPE - Invalid context for top_model argument.
        PRO_TK_BAD_INPUTS - One or more arguments was invalid.

*/

extern ProError ProParameterLockstatusSet (ProParameter  *param,
                                           ProLockstatus  lock_status);
/*
    Purpose: Set parameter lock status. .

    Input Arguments:
        param - The parameter.
        lock_status - The parameter lock status.

    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 ProParameterLockstatusGet (ProParameter  *param,
                                           ProLockstatus *lock_status);
/*
    Purpose: Get parameter lock status. .

    Input Arguments:
        param - The parameter.

    Output Arguments:
        lock_status - The parameter lock status.

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

*/

extern ProError ProParameterIsInactive(ProParameter* param, ProBoolean* is_inactive);
/*
    Purpose: Determines whether the parameter is inactive.
             <p> NOTE:
             <p> Currently supports only symbol instance annotation element 
             parameters. returns PRO_B_TRUE if parameter is inactive due to 
             current customization of symbol.

    Input Arguments:
        param - The handle to the parameter to query.

    Output Arguments:
        is_inactive - This is PRO_B_TRUE if the specified parameter is 
                      inactive.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the information.
        PRO_TK_E_NOT_FOUND - The owner was not found.
        PRO_TK_INVALID_TYPE - owner of parameter do not support inactive 
                              parameters.
        PRO_TK_GENERAL_ERROR - The parameter was not found, or the function 
                               could not perform the action.

*/
extern ProError ProParameterIsListValue (ProParameter *param,
                                         ProBoolean   *is_list);
/*
    Purpose: Get whether parameter value type is list or not.

    Input Arguments:
        param - The parameter.

    Output Arguments:
        is_list - Will be PRO_B_TRUE if the specified parameter value type is 
                  list, else, will be PRO_B_FALSE.

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

*/

extern ProError ProParameterListValueGet (ProParameter   *param,
                                          ProParamvalue **proval_array,
                                          ProUnititem    *units);
/*
    Purpose: Retrieves the list values and units of the specified ProParameter.

    Input Arguments:
        param - The handle to the parameter to query.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the information. 
                          Parameter could be unitless.
        PRO_TK_E_NOT_FOUND - The owner was not found.
        PRO_TK_BAD_INPUTS - One or more arguments was invalid.
        PRO_TK_GENERAL_ERROR - The parameter was not found, or the function 
                               could not perform the action.

*/

extern ProError ProParameterListValueSet (ProParameter   *param,
                                          ProParamvalue  *proval,
                                          ProUnititem    *units);
/*
    Purpose: Sets the list values given with unit of an existing ProParameter.

    Input Arguments:
        param - The handle to the parameter to set.
        proval - ProArray of param values to set. The values assumed to be in 
                 the units specified by units argument (when the units argument 
                 is not NULL) or in the units of the owner model, when argument 
                 units is NULL.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully set the list values and 
                          units.
        PRO_TK_E_NOT_FOUND - The owner was not found.
        PRO_TK_BAD_INPUTS - One or more arguments was invalid.
        PRO_TK_INVALID_TYPE - The units type provided does not match the units 
                              of the parameter.
        PRO_TK_GENERAL_ERROR - The parameter was not found, or the function 
                               could not perform the action.

*/

extern ProError ProParameterListTypeSet (ProParameter  *param,
                                         ProBoolean     is_list);
/*
    Purpose: Set parameter value type as list.

    Input Arguments:
        param - The parameter.
        is_list - This is PRO_B_TRUE if the specified parameter value type 
                  wants to set as list. This is PRO_B_FALSE if the specified 
                  parameter value type wants to set as non-list.

    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 ProParameterEnumeratedSet (ProParameter   *param,  
                                           ProParamvalue  *valid_values,
                                           ProParamvalue  *p_default);
/*
    Purpose: Set a parameter as enumerated, and provides the values that to be 
             assigned to it.

    Input Arguments:
        param - The parameter.
        valid_values - ProArray of values that should be assigned to this 
                       parameter. Cannot be NULL.
        p_default - The default (current) value for the parameter.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERRORS - The function succeeded.
        PRO_TK_BAD_INPUTS - One or more arguments is invalid.

*/

extern ProError ProParameterRangeSet (ProParameter    *param, 
                                      ProParamLimit   *minimum,  
                                      ProParamLimit   *maximum,
                                      ProParamvalue   *p_default);
/*
    Purpose: Identify for parameter's value to be restricted to a certain 
             range.

    Input Arguments:
        param - The parameter.
        minimum - The minimum value for this parameter.
        maximum - The maximum value for this parameter.
        p_default - The default (current) value for the parameter.

    Output Arguments:
        none

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

*/

PRO_END_C_DECLS

#endif