#ifndef PROMFG_H
#define PROMFG_H

/* ProMfg.h:  defines actions specific to manufacturing models */


#include <ProObjects.h>





PRO_BEGIN_C_DECLS

typedef struct mfg*  ProMfg;

typedef enum pro_mfg_types
{
 PRO_MFGTYPE_NONE         = -1,
 PRO_MFGTYPE_MACH_PART    = PRO_PART,           /* part machining mfg,
                                                   no longer supported       */
 PRO_MFGTYPE_MACH_ASSEM   = PRO_ASSEMBLY,       /* assembly machining mfg    */
 PRO_MFGTYPE_SHEET_METAL  = 81,                 /* sheetmetal mfg            */
 PRO_MFGTYPE_MOLD         = -10,                /* mold mfg                  */
 PRO_MFGTYPE_CAST         = -20,                /* cast mfg                  */
 PRO_MFGTYPE_CMM          = 420                 /* CMM mfg                   */
}       ProMfgType;


extern ProError ProMfgMdlCreate (ProName            name,
                                 ProMfgType         sub_type,
                                 ProMdl             model,
                                 ProMfg            *p_mfg);
/*
    Purpose: Creates a manufacturing object. <b>Note:</b> In Creo 3 this 
             function does not support names longer than 31 characters. It will 
             return PRO_TK_BAD_INPUTS for longer names. The support for 
             ProMdlName will be added in a future release.

    Input Arguments:
        name - The name of the manufacturing object.
        sub_type - The manufacturing subtype defined by the enum 
                   <i>ProMfgType</i>.
        model - The reference model prompted for during creation of the 
                manufacturing object. For part machining, this should be the 
                design part. For sheet metal manufacturing, this should be the 
                sheet metal workpiece. For all other types, this argument is 
                ignored.

    Output Arguments:
        p_mfg - The newly created manufacturing object.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully created the manufacturing 
                          object.
        PRO_TK_E_FOUND - A manufacturing object with the specified name already 
                         exists.
        PRO_TK_UNSUPPORTED - The function did not create the manufacturing 
                             object with subtype PRO_MFGTYPE_MACH_PART.
        Other - One or more of the input arguments are invalid, so the function 
                did not create the manufacturing object.

*/


extern ProError ProMfgTypeGet (ProMfg       mfg,
                               ProMfgType  *r_sub_type);
/*
    Purpose: Returns the type of the specified manufacturing object.

    Input Arguments:
        mfg - The manufacturing object

    Output Arguments:
        r_sub_type - The type of the manufacturing object

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

*/


typedef struct  Pro_Tool  
{                           /* absolute reference to mfg tool */
  ProLine  tool_id;
  ProMfg   owner_mfg;
}  ProTool;


/* "forward" typedefs for various manufacturing types defined elsewhere */

typedef                struct pro_model_item  ProFixture;
typedef                struct pro_model_item  *ProFixturePtr;
typedef PRO_CONST_ARG  struct pro_model_item  *ProConstFixturePtr;

typedef                struct Pro_Elem  *ProPecktable;
typedef PRO_CONST_ARG  struct Pro_Elem  *ProConstPecktable;


/* typedefs specific to the ProMfg object */


typedef ProError  (*ProMfgToolAction) ( PRO_CONST_ARG ProTool* tool,
                                        ProAppData app_data );
/*
    Purpose: The generic user function for a tool.

    Input Arguments:
        tool - The handle to the tool
        app_data - The application data passed to <b>ProMfgToolVisit()</b>

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - Visit the next tool, if present.
        Other values - Stop visiting at the next tool.

*/

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

extern ProError  ProMfgAssemGet  (   PRO_CONST_ARG ProMfg    mfg,
                                     ProAssembly    *r_assem_obj);
/*
    Purpose: Retrieves the top-level assembly of the specified manufacturing 
             model.

    Input Arguments:
        mfg - The handle to the manufacturing model

    Output Arguments:
        r_assem_obj - The handle to the top-level assembly

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the information.
        PRO_TK_E_NOT_FOUND - The top-level assembly of the manufacturing model 
                             was not found.
        PRO_TK_BAD_INPUTS - The input argument is invalid.

*/


extern ProError  ProMfgSolidGet  ( PRO_CONST_ARG ProMfg      mfg,
                                   ProSolid   *r_solid_obj);
/*
    Purpose: Retrieves the solid in which a manufacturing model's features are 
             placed.

    Input Arguments:
        mfg - The handle to the manufacturing model

    Output Arguments:
        r_solid_obj - The handle to the solid in which the manufacturing 
                      features are stored

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the information.
        PRO_TK_E_NOT_FOUND - The storage solid of the manufacturing model was 
                             not found.
        PRO_TK_BAD_INPUTS - The input argument is invalid.

*/


extern ProError  ProMfgFeatureOwnerGet  ( PRO_CONST_ARG ProMfg           mfg,
                                          ProAsmcomppath  *p_mfg_feat_owner_path);
/*
    Purpose: Retrieves the component path from the top level to the storage 
             solid of the specified manufacturing model. You retrieve the 
             storage solid using the <b>ProMfgSolidGet()</b> function.

    Input Arguments:
        mfg - The handle to the manufacturing model

    Output Arguments:
        p_mfg_feat_owner_path - The component path information

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the information.
        PRO_TK_E_NOT_FOUND - The storage solid of the manufacturing model was 
                             not found.
        PRO_TK_BAD_INPUTS - The input argument is invalid.

    See Also:
        ProMfgSolidGet()
*/


extern ProError  ProMfgToolVisit  (PRO_CONST_ARG ProMfg            mfg,
                                   ProMfgToolAction  action_fnc,
                                   void             *app_data);
/*
    Purpose: Visits all the tools in the specified manufacturing model.
             <p> NOTE:
             <p> The <i>action_fnc</i> callback should not attempt to add or 
             remove tools from the manufacturing model. You should add or 
             remove tools after this function has completed execution.

    Input Arguments:
        mfg - The handle to the manufacturing model.
        action_fnc - The callback function called for every tool visited. If 
                     the function returns anything other than PRO_TK_NO_ERROR, 
                     visiting stops immediately after the current tool.
        app_data - The user-specified data used by the action function.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - Visiting completed successfully, or there were no 
                          tools in the manufacturing model.
        PRO_TK_BAD_INPUTS - One of the arguments is invalid.
        Other - Any other value is the value returned by the action function 
                (visiting stopped).

*/


extern ProError  ProMfgPecktableSet (PRO_CONST_ARG ProMfg              mfg, 
                                     ProConstPecktable   peck_table);
/*
    Purpose: Sets or replaces the peck table in the specified manufacturing 
             model.
             <p> NOTE:
             <p> This function does not free the peck table. To free the table, 
             call the function <b>ProPecktableFree()</b>.

    Input Arguments:
        mfg - The handle to manufacturing model

    Output Arguments:
        peck_table - The handle to the peck table

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

    See Also:
        ProPecktableFree()
*/


extern ProError  ProMfgFixtActivate  ( PRO_CONST_ARG ProMfg               mfg, 
                                       ProConstFixturePtr   fixture);
/*
    Purpose: Sets the active feature for the specified manufacturing model.

    Input Arguments:
        mfg - The handle to the manufacturing model.
        fixture - The fixture to be activated (all others are then 
                  deactivated). Pass NULL to deactivate all the fixtures.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully set the active feature.
        PRO_TK_E_NOT_FOUND - The specified manufacturing model or solid was not 
                             found.
        PRO_TK_BAD_INPUTS - One or more of the arguments are invalid.

*/


PRO_END_C_DECLS


#endif  /* PROMFG_H */