#ifndef PROCOLLECT_H
#define PROCOLLECT_H

#include <ProSelection.h>

PRO_BEGIN_C_DECLS




typedef enum pro_coll_type
{
  PRO_COLLECTION_LEGACY = 1,
  PRO_COLLECTION_SRFCOLL,
  PRO_COLLECTION_CRVCOLL
} ProCollectionType;

typedef void* ProCollectionGetOptions;

extern ProError ProCollectionTypeGet (ProCollection      collection,
                                      ProCollectionType *type);
/*
    Purpose: Get the type of a ProCollection.

    Input Arguments:
        collection - The collection object.

    Output Arguments:
        type - The type of the collection.

    Return Values:
        PRO_TK_NO_ERROR - The function succeded.
        PRO_TK_BAD_INPUTS - One or more arguments is invalid.
        PRO_TK_BAD_CONTEXT - The type of collection has not been established.

*/

extern ProError ProCollectionFree(ProCollection     *p_coll);
/*
    Purpose: Frees a ProCollection object.

    Input Arguments:
        p_coll - pointer to the collection

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR PRO_TK_BAD_INPUTS

*/

typedef enum pro_coll_instr_type
{
 PRO_SURFCOLL_SINGLE_SURF      = 1,
 PRO_SURFCOLL_SEED_N_BND       = 2,
 PRO_SURFCOLL_QUILT_SRFS       = 3,
 PRO_SURFCOLL_ALL_SOLID_SRFS   = 4,
 PRO_SURFCOLL_NEIGHBOR         = 5,
 PRO_SURFCOLL_NEIGHBOR_INC     = 6,
 PRO_SURFCOLL_ALL_QUILT_SRFS   = 7,  /* Not supported for use in the surface collection UI, 
                                        or in feature element trees. */
 PRO_SURFCOLL_ALL_MODEL_SRFS   = 8,  /* Not supported for use in the surface collection UI, 
                                        or in feature element trees. */
 PRO_SURFCOLL_LOGOBJ_SRFS      = 9,
 PRO_SURFCOLL_DTM_PLN          = 10, /* Not supported for use in the surface collection UI, 
                                        or in feature element trees. */

   /* surface collection behaviors */
   PRO_SURFCOLL_DISALLOW_QLT       = 11,
   PRO_SURFCOLL_DISALLOW_SLD       = 12,
   PRO_SURFCOLL_DONT_MIX           = 13,
   PRO_SURFCOLL_SAME_SRF_LST       = 14,
   PRO_SURFCOLL_USE_BACKUP         = 15,
   PRO_SURFCOLL_DONT_BACKUP        = 16,
   PRO_SURFCOLL_DISALLOW_LOBJ      = 17,
   PRO_SURFCOLL_ALLOW_DTM_PLN      = 18,
   PRO_SURFCOLL_SEED_N_BND_INC_BND = 19,
   PRO_SURFCOLL_QUERY              = 20,
   PRO_SURFCOLL_ALLOW_QUERY        = 21, 
   
   PRO_SURFCOLL_GEOM_RULE          = 23,
   PRO_SURFCOLL_TANG_SRF           = 24,
   PRO_SURFCOLL_SHAPE_BASED        = 25,
   PRO_SURFCOLL_BODY_SRFS          = 26,
   PRO_SURFCOLL_ALL_BODY_SRFS      = 27,
   PRO_SURFCOLL_ASM_LOGOBJ_SRFS    = 28,

 PRO_CURVCOLL_ONE_BY_ONE       = 101,
 PRO_CURVCOLL_TAN_CHAIN        = 102,
 PRO_CURVCOLL_CURVE_CHAIN      = 103,
 PRO_CURVCOLL_BNDRY_CHAIN      = 104,
 PRO_CURVCOLL_SURF_CHAIN       = 105,
 PRO_CURVCOLL_LOG_EDGE         = 106,
 PRO_CURVCOLL_ALL_EDGES        = 107,
 PRO_CURVCOLL_CONVEX_EDGES     = 108,
 PRO_CURVCOLL_CONCAVE_EDGES    = 109
} ProCollectioninstrType;

typedef enum pro_coll_ref_type
{
 PRO_SURFCOLL_REF_SINGLE        = 1,
 PRO_SURFCOLL_REF_SINGLE_EDGE   = 2,
 PRO_SURFCOLL_REF_SEED          = 3,
 PRO_SURFCOLL_REF_BND           = 4,
 PRO_SURFCOLL_REF_SEED_EDGE     = 5,
 PRO_SURFCOLL_REF_NEIGHBOR      = 6,
 PRO_SURFCOLL_REF_NEIGHBOR_EDGE = 7,
 PRO_SURFCOLL_REF_GENERIC       = 8,

 PRO_CURVCOLL_REF_EDGE          = 101,
 PRO_CURVCOLL_REF_ALL           = 102,
 PRO_CURVCOLL_REF_FROM_TO       = 103,
 PRO_CURVCOLL_REF_FROM_TO_FLIP  = 104,
 PRO_CURVCOLL_REF_FROM          = 105,
 PRO_CURVCOLL_REF_TO            = 106
} ProCollectionrefType;
 
typedef enum pro_coll_instr_attr
{
 PRO_REF_INCLUDE       = 1,
 PRO_REF_EXCLUDE       = 2
} ProCollectioninstrAttr;

typedef enum pro_chain_coll_ui_control
{
    PRO_CHAINCOLLUI_ONE_BY_ONE                  = 101,
    PRO_CHAINCOLLUI_TAN_CHAIN                   = 102,
    PRO_CHAINCOLLUI_CURVE_CHAIN                 = 103,
    PRO_CHAINCOLLUI_BNDRY_CHAIN                 = 104,
    PRO_CHAINCOLLUI_SURF_CHAIN                  = 105,
    PRO_CHAINCOLLUI_LOG_EDGE                    = 106,
    PRO_CHAINCOLLUI_FROM_TO                     = 110,
    PRO_CHAINCOLLUI_ALLOW_LENGTH_ADJUSTMENT     = 111,
    PRO_CHAINCOLLUI_ALLOW_ALL                   = 112,
    PRO_CHAINCOLLUI_ALLOW_EXCLUDED              = 113,
    PRO_CHAINCOLLUI_ALLOW_APPENDED              = 114
} ProChaincollUIControl;

/*** Opaque handles ***/

typedef struct pro_coll_instr_ref *ProCollectionref;  /* Collection reference */

typedef struct pro_coll_instr *ProCollectioninstr;  /* Collection instruction */


extern ProError ProCollectionAlloc(ProCollection    *r_coll);
/*
    Purpose: <B>Note:</B> This function accesses a legacy version of the 
             ProCollection interface. It has been superseded by the functions: 
             <UL> 
             <LI>ProCrvcollectionAlloc() 
             <LI>ProSrfcollectionAlloc() 
             </UL> Please consult the Creo Parametric TOOLKIT user's guide 
             chapter on "Collections" for more information. 
             <P>Allocates a ProCollection object

    Input Arguments:
        none

    Output Arguments:
        r_coll - pointer to new collection

    Return Values:
        PRO_TK_NO_ERROR PRO_TK_OUT_OF_MEMORY

*/

extern ProError ProCollectioninstrAlloc(ProCollectioninstrType  instr_type,
                                        ProCollectioninstrAttr  attr,
                                        ProCollectioninstr      *r_instr);
/*
    Purpose: <B>Note:</B> This function accesses an older version of the 
             ProCollection interface. It has been superseded. Please consult 
             the Creo Parametric TOOLKIT user's guide chapter on "Collections" 
             for more information. 
             <P> Allocates a ProCollectioninstr object 
             <P>

    Input Arguments:
        instr_type - the instruction type
        attr - the instruction attribute

    Output Arguments:
        r_instr - pointer to new instruction

    Return Values:
        PRO_TK_NO_ERROR PRO_TK_OUT_OF_MEMORY

*/

extern ProError ProCollectioninstrFree(ProCollectioninstr *p_instr);
/*
    Purpose: <B>Note:</B> This function accesses an older version of the 
             ProCollection interface. It has been superseded. Please consult 
             the Creo Parametric TOOLKIT user's guide chapter on "Collections" 
             for more information. 
             <P> Frees a ProCollectioninstr object.

    Input Arguments:
        p_instr - pointer to the instruction

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR PRO_TK_BAD_INPUTS

*/

extern ProError ProCollectioninstrTypeGet(ProCollectioninstr instruction,
                                          ProCollectioninstrType *r_type);
/*
    Purpose: <B>Note:</B> This function accesses an older version of the 
             ProCollection interface. It has been superseded. Please consult 
             the Creo Parametric TOOLKIT user's guide chapter on "Collections" 
             for more information. 
             <P>To get the type of a collection instruction

    Input Arguments:
        instruction - The collection instruction

    Output Arguments:
        r_type - The type of the collection instruction

    Return Values:
        PRO_TK_NO_ERROR PRO_TK_BAD_INPUTS

*/

extern ProError ProCollectioninstrTypeSet(ProCollectioninstr instruction,
                                           ProCollectioninstrType type);
/*
    Purpose: <B>Note:</B> This function accesses an older version of the 
             ProCollection interface. It has been superseded. Please consult 
             the Creo Parametric TOOLKIT user's guide chapter on "Collections" 
             for more information. 
             <P> To get the type of a collection instruction

    Input Arguments:
        instruction - The collection instruction
        type - The type of the collection instruction

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR PRO_TK_BAD_INPUTS

*/

extern ProError ProCollectionrefAlloc(ProCollectionrefType type,
                                      ProSelection         selection,
                                      ProCollectionref     *r_ref);
/*
    Purpose: <B>Note:</B> This function accesses an older version of the 
             ProCollection interface. It has been superseded. Please consult 
             the Creo Parametric TOOLKIT user's guide chapter on "Collections" 
             for more information. 
             <P> Allocate a new ProCollectionRef object

    Input Arguments:
        type - Type of the reference
        selection - Selection identifying the target of the reference

    Output Arguments:
        r_ref - Pointer to the new collection reference object

    Return Values:
        PRO_TK_NO_ERROR PRO_TK_BAD_INPUTS PRO_TK_OUT_OF_MEMORY

*/

extern ProError ProCollectionrefFree(ProCollectionref     *p_ref);
/*
    Purpose: <B>Note:</B> This function accesses an older version of the 
             ProCollection interface. It has been superseded. Please consult 
             the Creo Parametric TOOLKIT user's guide chapter on "Collections" 
             for more information. 
             <P> Free a collection reference object

    Input Arguments:
        p_ref - Pointer to the collection reference object

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR PRO_TK_BAD_INPUTS

*/

extern ProError ProCollectioninstrRefAdd(ProCollectioninstr    instruction,
                                         ProCollectionref      reference);
/*
    Purpose: <B>Note:</B> This function accesses an older version of the 
             ProCollection interface. It has been superseded. Please consult 
             the Creo Parametric TOOLKIT user's guide chapter on "Collections" 
             for more information. 
             <P> Adds a new reference to a collection instruction

    Input Arguments:
        instruction - the instruction object to contain the new reference
        reference - the ProCollectionref object to be added to the instruction

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR PRO_TK_BAD_INPUTS PRO_TK_OUT_OF_MEMORY

*/

extern ProError ProCollectioninstrRefRemove(ProCollectioninstr instruction,
                                            ProCollectionref   reference);
/*
    Purpose: <B>Note:</B> This function accesses an older version of the 
             ProCollection interface. It has been superseded. Please consult 
             the Creo Parametric TOOLKIT user's guide chapter on "Collections" 
             for more information. 
             <P>To remove the specified reference from the specified collection 
             instruction

    Input Arguments:
        instruction - The collection instruction object
        reference - The collection reference object.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR
        PRO_TK_BAD_INPUTS - The instruction and/or reference was invalid.
        PRO_TK_BAD_CONTEXT - The reference was not found in the instruction

*/

extern ProError ProCollectionrefTypeGet (ProCollectionref     reference,
                                         ProCollectionrefType *r_type);
/*
    Purpose: <B>Note:</B> This function accesses an older version of the 
             ProCollection interface. It has been superseded. Please consult 
             the Creo Parametric TOOLKIT user's guide chapter on "Collections" 
             for more information. 
             <P>Get the type of a specified collection reference

    Input Arguments:
        reference - The collection reference object

    Output Arguments:
        r_type - The reference type

    Return Values:
        PRO_TK_NO_ERROR PRO_TK_BAD_INPUTS

*/

extern ProError ProCollectionrefTypeSet(ProCollectionref     reference,
                                        ProCollectionrefType type);
/*
    Purpose: <B>Note:</B> This function accesses an older version of the 
             ProCollection interface. It has been superseded. Please consult 
             the Creo Parametric TOOLKIT user's guide chapter on "Collections" 
             for more information. 
             <P>Sets the type of a specified collection reference

    Input Arguments:
        reference - The collection reference object
        type - The reference type

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR PRO_TK_BAD_INPUTS

*/

extern ProError ProCollectionrefSelectionGet(ProCollectionref    reference,
                                             ProSelection        *r_selection);
/*
    Purpose: <B>Note:</B> This function accesses an older version of the 
             ProCollection interface. It has been superseded. Please consult 
             the Creo Parametric TOOLKIT user's guide chapter on "Collections" 
             for more information. 
             <P> Gets the selection of a specified collection reference object.

    Input Arguments:
        reference - The collection reference object

    Output Arguments:
        r_selection - The selection structure for the reference

    Return Values:
        PRO_TK_NO_ERROR PRO_TK_BAD_INPUTS

*/

extern ProError ProCollectionrefSelectionSet(ProCollectionref    reference,
                                             ProSelection        selection);
/*
    Purpose: <B>Note:</B> This function accesses an older version of the 
             ProCollection interface. It has been superseded. Please consult 
             the Creo Parametric TOOLKIT user's guide chapter on "Collections" 
             for more information. 
             <P> Sets the selection of a specified collection reference object.

    Input Arguments:
        reference - The collection reference object
        selection - The selection structure for the reference

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR PRO_TK_BAD_INPUTS

*/

typedef ProError (*ProCollectionrefAction)(ProCollectionref   ref,
                                           ProError           status,
                                           ProAppData         app_data);
/*
    Purpose: <B>Note:</B> This function accesses an older version of the 
             ProCollection interface. It has been superseded. Please consult 
             the Creo Parametric TOOLKIT user's guide chapter on "Collections" 
             for more information. 
             <P> Type for action callback function for 
             ProCollectioninstrRefVisit()

    Input Arguments:
        ref - The reference object for which the function is called.
        status - The return value from the preceding call to the filter 
                 function.
        app_data - The user-defined data passed to ProCollectioninstrRefVisit).

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - continue visiting
        PRO_TK_CONTINUE - continue visiting
        other - terminate visiting and return this value from 
                ProCollectioninstrRefVisit()

*/

typedef ProError (*ProCollectionrefFilter)(ProCollectionref  ref,
                                           ProAppData        app_data);
/*
    Purpose: <B>Note:</B> This function accesses an older version of the 
             ProCollection interface. It has been superseded. Please consult 
             the Creo Parametric TOOLKIT user's guide chapter on "Collections" 
             for more information. 
             <P> Type for filter callback function for 
             ProCollectioninstrRefVisit().

    Input Arguments:
        ref - The reference object for which the function is called.
        app_data - The user-defined data passed to 
                   ProCollectioninstrRefVisit().

    Output Arguments:
        none

    Return Values:
        PRO_TK_CONTINUE - Skip the call to the action function for this 
                          reference, but continue visiting.
        Other - Call the action function and pass this value as the input 
                status argument.

*/

extern ProError ProCollectioninstrRefVisit(ProCollectioninstr       instruction,
                                           ProCollectionrefAction   action,
                                           ProCollectionrefFilter   filter,
                                           ProAppData               app_data);
/*
    Purpose: <B>Note:</B> This function accesses an older version of the 
             ProCollection interface. It has been superseded. Please consult 
             the Creo Parametric TOOLKIT user's guide chapter on "Collections" 
             for more information. 
             <P> To visit all the references in a ProCollectioninstr object.

    Input Arguments:
        instruction - The collection instruction object
        action - The action function to be called for each reference
        filter - The filter function to be called for each reference. If NULL, 
                 visits all references using the action function.
        app_data - A pointer to any data to be passed down to the filter and 
                   action functions.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - Finished visiting all the references.
        PRO_TK_BAD_INPUTS - Invalid arguments, or no references found.
        Other - The value returned from the last call to the action function.

*/

extern ProError ProCollectionInstrAdd(ProCollection      collection,
                                      ProCollectioninstr instruction);
/*
    Purpose: <B>Note:</B> This function accesses an older version of the 
             ProCollection interface. It has been superseded. Please consult 
             the Creo Parametric TOOLKIT user's guide chapter on "Collections" 
             for more information. 
             <P> Add an instruction to a collection.

    Input Arguments:
        collection - The collection
        instruction - The instruction

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR PRO_TK_BAD_INPUTS
        PRO_TK_OBSOLETE_FUNC - A newer type of ProCollection was passed.

*/
extern ProError ProCollectionInstrRemove(ProCollection      collection,
                                         ProCollectioninstr instruction);
/*
    Purpose: <B>Note:</B> This function accesses an older version of the 
             ProCollection interface. It has been superseded. Please consult 
             the Creo Parametric TOOLKIT user's guide chapter on "Collections" 
             for more information. 
             <P> Remove an instruction from a collection

    Input Arguments:
        collection - The collection
        instruction - The instruction

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR PRO_TK_BAD_INPUTS
        PRO_TK_OBSOLETE_FUNC - A newer type of ProCollection was passed.

*/

typedef ProError (*ProCollectioninstrFilter)(ProCollectioninstr instruction,
                                             ProAppData         app_data);
/*
    Purpose: <B>Note:</B> This function accesses an older version of the 
             ProCollection interface. It has been superseded. Please consult 
             the Creo Parametric TOOLKIT user's guide chapter on "Collections" 
             for more information. 
             <P> Type for filter callback function for 
             ProCollectionInstrVisit().

    Input Arguments:
        instruction - The instruction for which the function is called.
        app_data - The user-defined data passed to ProCollectionInstrVisit().

    Output Arguments:
        none

    Return Values:
        PRO_TK_CONTINUE - Skip the call to the action function for this 
                          reference, but continue visiting.
        Other - Call the action function and pass this value as the input 
                status argument.

*/

typedef ProError (*ProCollectioninstrAction)(ProCollectioninstr instruction,
                                             ProError           filt_status,
                                             ProAppData         app_data);
/*
    Purpose: <B>Note:</B> This function accesses an older version of the 
             ProCollection interface. It has been superseded. Please consult 
             the Creo Parametric TOOLKIT user's guide chapter on "Collections" 
             for more information. 
             <P> Type for action callback function for 
             ProCollectionInstrVisit().

    Input Arguments:
        instruction - The instruction for which the function is called.
        filt_status - The status from the previous call to the filter function.
        app_data - The user-defined data passed to ProCollectionInstrVisit().

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - continue visiting
        PRO_TK_CONTINUE - continue visiting
        other - terminate visiting and return this value from 
                ProCollectionInstrVisit().

*/

extern ProError ProCollectionInstrVisit(ProCollection             collection,
                                        ProCollectioninstrFilter  filter,
                                        ProCollectioninstrAction  action,
                                        ProAppData                app_data);
/*
    Purpose: <B>Note:</B> This function accesses an older version of the 
             ProCollection interface. It has been superseded. Please consult 
             the Creo Parametric TOOLKIT user's guide chapter on "Collections" 
             for more information. 
             <P> Visit the instructions in a collection

    Input Arguments:
        collection - The collection
        filter - Filter function for instructions. If NULL, visits all 
                 instructions using the action function.
        action - Action function to be called for each instruction.
        app_data - Pointer to data to be passed to filter and action functions.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - Finished visiting all the instructions.
        PRO_TK_BAD_INPUTS - Invalid arguments, or the collection contained no 
                            items.
        PRO_TK_OBSOLETE_FUNC - A newer type of ProCollection was passed.
        Other - The value returned from the last call to the action function.

*/
extern ProError ProCrvcollectionInstrRegen(ProCollectioninstr      instruction,
                                        ProSelection            **r_sel_list,
                                        int                     *n_sel);
/*
    Purpose: <B>Note:</B> This function accesses an older version of the 
             ProCollection interface. It has been superseded. Please consult 
             the Creo Parametric TOOLKIT user's guide chapter on "Collections" 
             for more information. 
             <P> To regenerate a collection instruction and provide a list of 
             the resulting surfaces, curves and edges.

    Input Arguments:
        instruction - The collection instruction object

    Output Arguments:
        r_sel_list - Pointer to a ProArray (allocated by the function) of 
                     ProSelection objects describing the surfaces, curves and 
                     edges resulting from the collection.
        n_sel - Number of entries in sel_list.

    Return Values:
        PRO_TK_NO_ERROR
        PRO_TK_GENERAL_ERROR - The regeneration failed.

*/

typedef ProError (*ProCollFilter) (ProSelection **sels,
                                   ProSelection   cur_sel,
                                   ProAppData   app_data);
/*
    Purpose: Post filter function for surface collection

    Input Arguments:
        sels - Previously selected items.
        cur_sel - Current selection. Filter function determines whether cur_sel 
                  is accepted.
        app_data - Application data

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - Accept current selection.
        PRO_TK_GENERAL_ERROR - Reject current selection.

*/


typedef ProError (*ProCrvcollFilter) (ProSelection   cur_sel,
                                      ProAppData   app_data);
/*
    Purpose: Post filter function for chain collection

    Input Arguments:
        cur_sel - Current selection. Filter function determines whether cur_sel 
                  is accepted.
        app_data - Application data

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - Accept current selection.
        some other value - Reject current selection.

*/

extern ProError ProCurvesCollect(ProChaincollUIControl *types,
                                 int                    n_types,
                                 ProCrvcollFilter          filter_func, 
                                 ProAppData             app_data,
                                 ProCollection          *collection,
                                 ProSelection           **sel_list,
                                 int                    *n_sel);
/*
    Purpose: Asks the user to interactively create a collection of chains

    Input Arguments:
        types - Array allocated by the Creo Parametric TOOLKIT application 
                defining which portion of the user interface that the Creo 
                Parametric user will be allowed to use while in the dialog. 
                Following instruction types are supported:<UL><LI> 
                PRO_CHAINCOLLUI_ONE_BY_ONE<LI> PRO_CHAINCOLLUI_TAN_CHAIN<LI> 
                PRO_CHAINCOLLUI_CURVE_CHAIN<LI> PRO_CHAINCOLLUI_BNDRY_CHAIN<LI> 
                PRO_CHAINCOLLUI_SURF_CHAIN<LI> PRO_CHAINCOLLUI_LOG_EDGE<LI> 
                PRO_CHAINCOLLUI_FROM_TO<LI> 
                PRO_CHAINCOLLUI_ALLOW_LENGTH_ADJUSTMENT<LI> 
                PRO_CHAINCOLLUI_ALLOW_ALL<LI> 
                PRO_CHAINCOLLUI_ALLOW_EXCLUDED<LI> 
                PRO_CHAINCOLLUI_ALLOW_APPENDED
        n_types - The number of instruction types in the array.
        filter_func - The filter function called just after each selection of a 
                      curve or edge Pass NULL to skip this filter.
        app_data - Application data passed to the filter function. Can be NULL.
        collection - The resulting collection object. This pointer must be 
                     allocated by calling ProCrvcollectionAlloc(). If the input 
                     collection contains instructions already, they will be 
                     appended into the details shown by the dialog.

    Output Arguments:
        sel_list - Pointer to a ProArray (allocated by the function) of 
                   ProSelection objects describing the curves and edges 
                   resulting from the collection. Free this array using 
                   ProSelectionarrayFree(). Pass NULL if not interested in this 
                   information at this time. <P> <B>NOTE</B>: If using a 
                   collection that permits "extended" and "trimmed" chains, the 
                   selection list might not be 100% accurate (because there 
                   will be no selection representing the extended and trimmed 
                   item(s).
        n_sel - Number of entries in sel_list, if sel_list is not NULL.

    Return Values:
        PRO_TK_NO_ERROR - The function succeeded.
        PRO_TK_BAD_INPUTS - One or more arguments is invalid.
        PRO_TK_USER_ABORT - The user aborted the collection activity.
        PRO_TK_BAD_CONTEXT - The input ProCollection contains instructions that 
                             cannot be resolved into a single chain.

    See Also:
        ProCrvcollectionAlloc()
*/

extern ProError ProSurfacesCollect(ProCollectioninstrType *types,
                                   int                    n_types,
                                   ProCollFilter          filter_func,
                                   ProAppData             app_data,
                                   ProCollection          collection,
                                   ProSelection           **sel_list,
                                   int                    *n_sel);
/*
    Purpose: Asks the user to interactively create a collection of surfaces.

    Input Arguments:
        types - Array defining the instruction types the Creo Parametric user 
                will be allowed to use.
        n_types - The size of the types array
        filter_func - Filter function called before each selection is made. Can 
                      be NULL.
        app_data - Application data passed to the filter function. Can be NULL.
        collection - The resulting collection object, this pointer is allocated 
                     by calling ProCollectionAlloc and NULL can also be passed. 
                     <B>Note:</B>If this collection already contains selected 
                     items, the dialog will display those contents to be edited 
                     interactively in the dialog. The ProCollection will point 
                     to the modified contents once the dialog OK button is 
                     chosen.

    Output Arguments:
        sel_list - Pointer to a ProArray (allocated by the function) of 
                   ProSelection objects describing the surfaces resulting from 
                   the collection. Free this using ProSelectionarrayFree().
        n_sel - Number of entries in sel_list.

    Return Values:
        PRO_TK_NO_ERROR - The function succeeded.
        PRO_TK_GENERAL_ERROR - The function failed.

*/

PRO_END_C_DECLS

#endif /* PROCOLLECT_H */