#ifndef PRO_CABLING_H
#define PRO_CABLING_H

/*----------------------------------------------------------*\
    Headers
\*----------------------------------------------------------*/

#include <ProToolkit.h>
#include <ProMdl.h>
#include <ProModelitem.h>
#include <ProSelection.h>
#include <ProArray.h>
#include <ProParamval.h>
#include <ProColor.h>
#include <ProSurface.h>

PRO_BEGIN_C_DECLS

/*----------------------------------------------------------*\
    Data types
\*----------------------------------------------------------*/
typedef struct sld_part* ProHarness;

/* ProCable and ProCablelocation are defined as ProFeature.
   (See protoolkit/includes/ProObjects.h) */
typedef struct pro_model_item ProCable;
typedef struct pro_model_item ProCablelocation;

typedef struct pro_sub_harness
{
    int     id;
    ProName name;
    ProAssembly owner;
} ProSubharness;

typedef struct pro_spool
{
    ProName name;
    ProAssembly owner;
} ProSpool;

typedef enum
{
    PRO_CABLETYPE_CABLE = 0,
    PRO_CABLETYPE_BUNDLE,
    PRO_CABLETYPE_WIRE,
    PRO_CABLETYPE_CONDUCTOR
} ProCableType;

typedef enum
{
    PRO_BUNDLE_NONE = -1,
    PRO_BUNDLE_SHRINK,
    PRO_BUNDLE_TUBE,
    PRO_BUNDLE_TAPE
} ProBundleType;

typedef ProAsmcomppath  ProConnector;

/* struct procbl_cable_segment is defined 
   in prodevelop/includes/prodgmstruc.h */
typedef struct procbl_cable_segment *ProCablesegment;
typedef struct procbl_cable_segment_info *ProCablesegmentInfo;

typedef enum
{
    PRO_LOC_CONNECTOR = 0,
    PRO_LOC_POINT,
    PRO_LOC_FREE,
    PRO_LOC_DEPENDENT,
    PRO_LOC_AXIS,
    PRO_LOC_USE_DIR,
    PRO_LOC_OFFSET,
    PRO_LOC_SPLICE,
    PRO_LOC_LOC,
    PRO_LOC_OFFSET_CSYS,
    PRO_LOC_OFFSET_AXIS
} ProCablelocationType;

/* struct procbl_cable_segment is defined 
   in prodevelop/includes/prodgmstruc.h */
typedef struct procbl_loc_ref *ProCablelocationref;

typedef enum
{
    PRO_PARAMVAL_SINGLE,
    PRO_PARAMVAL_MULTIPLE
} ProParamvalNumber;

typedef struct  pro_cable_param_member {
	ProName   name;
	ProParamvalue  value;
} ProCableparammember;

typedef struct  pro_cable_parameter { 
	ProName    name;
        ProParamvalNumber  value_number;
	union {
		ProParamvalue    value;
		ProCableparammember*  members; /* ProArray of cable parameters*/
	}  param_value;
}  ProCableparam;

typedef enum {
	PRO_BNDLCBL_LEVEL_ALL = -1,  
	                   /*  Retrieve all the cables  */
	PRO_BNDLCBL_LEVEL_INPUT = 1, 
                           /* Retrieve cables in the input bundle only  */
	PRO_BNDLCBL_LEVEL_FIRST = 2     
                           /*  Retrieve cables in the first-level 
			           bundles (if any).  */
} ProBundleCableLevel;     

typedef void* ProRouting;

/* =================================================================== *\
          Logical reference name functions
\* =================================================================== */

extern ProError ProCablesFromLogicalGet(
    ProAssembly assy,
    ProName     **p_cable_names);
/*
    Purpose: Returns list of imported but not created cables

    Input Arguments:
        assy - The handle to the assembly that contains the cable.

    Output Arguments:
        p_cable_names - Pointer to ProArray of names. The function allocates 
                        memory for this argument. To free it, call the function 
                        ProArrayFree.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully get list of cables.
        PRO_TK_BAD_INPUTS - One or more of the input arguments was invalid
        PRO_TK_E_NOT_FOUND - No cables imported from logical or all already 
                             created.
        PRO_TK_GENERAL_ERROR - Other errors.

*/

extern ProError ProCablesFromLogicalCreate(
    ProAssembly     assy,
    ProHarness      harness,
    ProName         *p_cable_names);
/*
    Purpose: Creates cables from logical If corresponding spools are not 
             created they are also created by this function.

    Input Arguments:
        assy - The assembly
        harness - The harness handle.
        p_cable_names - ProArray of cables' names.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully create cables.
        PRO_TK_BAD_INPUTS - One or more of the input arguments was invalid
        PRO_TK_E_FOUND - Specified cables not imported from logical or already 
                         created.
        PRO_TK_GENERAL_ERROR - Other errors.

*/

extern ProError ProCablesFromLogicalAllCreate( ProAssembly      assy,
                                               ProHarness       harness,
                                               ProName         *p_cable_names,
                                               ProCable       **r_crt_cbls );
/*
    Purpose: Creates cables from logical references. It creates also the 
             conductors of the given cable. If corresponding spools are not 
             created they are also created by this function.

    Input Arguments:
        assy - The assembly
        harness - The harness handle.
        p_cable_names - ProArray of cables' names.

    Output Arguments:
        r_crt_cbls - ProArray of ProCable of the created cables including 
                     conductors. To free it, call the function ProArrayFree.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully create cables.
        PRO_TK_BAD_INPUTS - One or more of the input arguments was invalid
        PRO_TK_GENERAL_ERROR - Other errors.

*/

extern ProError ProConnectorsFromLogicalGet (
    ProAssembly asm_mdl,
    ProName     **p_w_name);
/*
    Purpose: Returns list of imported, but not yet designated connectors

    Input Arguments:
        asm_mdl - The handle of cablings assembly.

    Output Arguments:
        p_w_name - Pointer to ProArray of logical connectors names. The 
                   function allocates memory for these arguments. To free it, 
                   call the function ProArrayFree.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved parameters.
        PRO_TK_BAD_INPUTS - One or more of the input arguments was invalid
        PRO_TK_E_NOT_FOUND - no cables imported from logical or all already 
                             created
        PRO_TK_GENERAL_ERROR - Other errors.

*/

extern ProError ProSpoolsFromLogicalGet (
    ProAssembly assy,
    ProName     **p_w_name);
/*
    Purpose: Return list of imported, but not created spools

    Input Arguments:
        assy - The handle of assembly

    Output Arguments:
        p_w_name - Pointer to ProArray of names. The function allocates memory 
                   for these arguments. To free it, call the function 
                   ProArrayFree.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieves parameters.
        PRO_TK_BAD_INPUTS - One or more of the input arguments was invalid.
        PRO_TK_E_FOUND - no spools imported from logica or all already created.
        PRO_TK_GENERAL_ERROR - Other errors.

*/

extern ProError ProSpoolsFromLogicalCreate (
    ProAssembly assy,
    ProName     *p_w_name,
    ProSpool    **p_spools);
/*
    Purpose: creates spools from logical after finishing the call, now reset 
             the current model back to its status before the call.

    Input Arguments:
        assy - The handle of assembly
        p_w_name - ProArray of spool names.

    Output Arguments:
        p_spools - Pointer to ProArray of spools. The function allocates memory 
                   for these arguments. To free it, call the function 
                   ProArrayFree.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieves parameters.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_E_FOUND - specified spools not imported from or already created.
        PRO_TK_GENERAL_ERROR - Other errors.

*/

/*-----------------------------------------------------------------------*\
    Functions to manage spools.
\*-----------------------------------------------------------------------*/
extern ProError ProAssemblySpoolsCollect(
    ProAssembly     asm_mdl,
    ProSpool        **p_spool);
/*
    Purpose: Collect spools in specified assembly

    Input Arguments:
        asm_mdl - Assembly owner of the spool

    Output Arguments:
        p_spool - ProArray of spool's handles. Function allocate memory for 
                  this argument. Use ProArrayFree to free it.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully initialize spool.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_E_NOT_FOUN - No spool found.
        PRO_TK_GENERAL_ERROR - Other error.

*/

extern ProError ProSpoolCreate(
    ProAssembly     assy,
    ProName         w_name,
    ProCableType    cable_type,
    ProBundleType  sheath_type,
    ProSpool        *p_spool);
/*
    Purpose: Creates new spool.

    Input Arguments:
        assy - The handle of spools assembly owner.
        w_name - The spool name.
        cable_type - The type of created spool.
        sheath_type - The type of bundle.

    Output Arguments:
        p_spool - The handle of created spool.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully creates new spool.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_E_FOUND - A spool with this name already exists. (<b>Note</b>: 
                         in this case p_spool will contain the spool 
                         information; this is an exception to the rule that all 
                         information in output arguments is unreliable if a 
                         function returns anything other than PRO_TK_NO_ERROR.)
        PRO_TK_GENERAL_ERROR - Other error.

*/

extern ProError ProSpoolParametersCollect(
    ProSpool                *spool,
    ProCableparam           **p_params);
/*
    Purpose: Retrieves parameters of specified spool

    Input Arguments:
        spool - Handle of spool.

    Output Arguments:
        p_params - ProArray of parameters. The function allocates memory for 
                   these arguments. To free it, call the function ProArrayFree.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved parameters.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_E_NOT_FOUND - A spool with this name does not exist.
        PRO_TK_GENERAL_ERROR - Other error.

*/

extern ProError ProSpoolParameterGet(
    ProSpool                *spool,
    ProName                 w_param_name,
    ProCableparam           *p_param);
/*
    Purpose: Retrieves one parameter of specified spool

    Input Arguments:
        spool - Handle of spool.
        w_param_name - Name of retrieved parameter

    Output Arguments:
        p_param - Parameter handle.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved parameter.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_GENERAL_ERROR - Other error.

*/

extern ProError ProSpoolCablesLengthGet(
    ProSpool                *spool,
    ProHarness               harness_ptr,
    double                  *p_length);
/*
    Purpose: Get the total length of all cables in the input harness using this 
             specified spool

    Input Arguments:
        spool - Handle of spool.
        harness_ptr - Handle of the specified harness part

    Output Arguments:
        p_length - total length of the cables.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully returned the length.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_GENERAL_ERROR - Other error.

*/

extern ProError ProSpoolParametersSet(
    ProSpool                *spool,
    ProCableparam           *p_params);
/*
    Purpose: Set parameters for specified spool

    Input Arguments:
        spool - Handle of spool.
        p_params - ProArray of new parameters.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully sets new parameters.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_E_NOT_FOUND - Spool with this name does not exist, or array does 
                             not contain required params, or read only params 
                             are changed.
        PRO_TK_GENERAL_ERROR - Other error.

*/

extern ProError ProSpoolParameterDelete(
    ProSpool        *spool,
    ProName         w_param_name);
/*
    Purpose: Deletes parameter in specified spool

    Input Arguments:
        spool - Handle of spool.
        w_param_name - Name of retrieved parameter

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully delete parameter.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_E_NOT_FOUND - Spool with this name does not exist.
        PRO_TK_GENERAL_ERROR - Other error.

*/

/*=====================================================================*\
        Connector functions
\*=====================================================================*/
extern ProError ProAssemblyConnectorsGet(
    ProAssembly         assy,
    ProConnector   **p_cons);
/*
    Purpose: Returns list of connectors in the assembly.

    Input Arguments:
        assy - The handle of cabling assembly.

    Output Arguments:
        p_cons - Pointer to ProArray of logical connectors. The function 
                 allocates memory for these arguments. To free it, call the 
                 function ProArrayFree.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved parameters.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_GENERAL_ERROR - Other errors.

*/

extern ProError ProConnectorWithAllParamsDesignate(
    ProAsmcomppath   *p_connector,
    ProName           name,
    ProBool           from_logical);
/*
    Purpose: Designate the specified component as an assembly connector with 
             all the logical parameters.

    Input Arguments:
        p_connector - Handle of connector to designate
        name - Name of the reference designator. It can be NULL when the 
               designation is not from logical reference.
        from_logical - PRO_B_TRUE for designation from logical reference. 
                       PRO_B_FALSE for default designation.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully designate.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_E_FOUND - The given name of the reference designator is already 
                         used by other connector
        PRO_TK_GENERAL_ERROR - Other errors.

*/

extern ProError ProConnectorDesignate(
    ProAsmcomppath   *p_connector,
    ProName             name);
/*
    Purpose: Designate the specified component as an assembly connector

    Input Arguments:
        p_connector - Handle of connector to designate
        name - Name of logical reference designator for the logical connector 
               (can be NULL)

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully designate.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_GENERAL_ERROR - Other errors.

*/

extern ProError ProConnectorUndesignate(
    ProConnector  *p_connector);
/*
    Purpose: Undesignate the specified connector

    Input Arguments:
        p_connector - Handle of connector to undesignate

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully undesignate.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_GENERAL_ERROR - Other errors.

*/

extern ProError ProConnectorEntryPortsGet  (
    ProConnector   *p_connector,
    ProCsys         **p_csys_array);
/*
    Purpose: Retrieves the entry ports for the specified connector.

    Input Arguments:
        p_connector - Handle of connector.

    Output Arguments:
        p_csys_array - ProArray of csys. Function allocate memory for this 
                       argument. User must free it with ProArrayFree.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_GENERAL_ERROR - Other errors.

*/

extern ProError ProConnectorParamGet(
    ProConnector    *p_connector,
    ProName         w_param_name,
    ProCableparam   *p_param);
/*
    Purpose: Gets connector's parameter

    Input Arguments:
        p_connector - The connectors handle.
        w_param_name - Parameter's name.

    Output Arguments:
        p_param - The parameter handle.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully gets parameter.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_GENERAL_ERROR - Other errors.

*/

extern ProError ProConnectorParamDelete(
    ProConnector    *p_connector,
    ProName         w_param_name);
/*
    Purpose: Deletes parameter of specified connector

    Input Arguments:
        p_connector - The connectors handle.
        w_param_name - The name of parameter.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully deletes parameter.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_E_NOT_FOUND - Connector or parameter with this name does not 
                             exist, parameter is required.
        PRO_TK_GENERAL_ERROR - Other errors.

*/

extern ProError ProConnectorParamsCollect(
    ProConnector    *p_connector,
    ProCableparam    **p_params);
/*
    Purpose: Retrives parameters of specified connector

    Input Arguments:
        p_connector - The connectors handle.

    Output Arguments:
        p_params - Pointer to ProArray of parameters. The function allocates 
                   memory for these arguments. To free it, call the function 
                   ProArrayFree.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieves parameters.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_GENERAL_ERROR - Other errors.

*/

extern ProError ProConnectorParamsSet(
    ProConnector    *p_connector,
    ProCableparam   *params);
/*
    Purpose: Sets parameters of specified connector

    Input Arguments:
        p_connector - The connectors handle.
        params - The new parameters.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully set parameters.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_E_NOT_FOUND - The specified assembly is invalid or the member is 
                             not a connector
        PRO_TK_GENERAL_ERROR - Other errors.

*/

/*-----------------------------------------------------------------------*\
    Functions to manage harnesses.
\*-----------------------------------------------------------------------*/

extern ProError ProAssemblyHarnessesCollect(
    ProAssembly     asm_mdl,
    ProHarness      **p_harness);
/*
    Purpose: Retrieves the array of harnesses for specified assembly and its 
             subassemblies.

    Input Arguments:
        asm_mdl - Handle of connector's assembly.

    Output Arguments:
        p_harness - ProArray of harnesses. Function allocates memory for this 
                    argument. User must free it with ProArrayFree.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_E_NOT_FOUND - Harness not found in assembly.
        PRO_TK_GENERAL_ERROR - Other errors.

*/

extern ProError ProAssemblyHarnessesTopCollect(
    ProAssembly     asm_mdl,
    ProHarness      **p_harness);
/*
    Purpose: Retrieves the array of harnesses for specified assembly.

    Input Arguments:
        asm_mdl - Handle of connector's assembly.

    Output Arguments:
        p_harness - ProArray of harnesses. Function allocates memory for this 
                    argument. User must free it with ProArrayFree.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_E_NOT_FOUND - Harness not found in assembly.
        PRO_TK_GENERAL_ERROR - Other errors.

*/

extern ProError ProHarnessCreate(
    ProAssembly     asm_mdl,
    ProName         w_name,
    ProHarness      *p_harness);
/*
    Purpose: Creates new harness

    Input Arguments:
        asm_mdl - The cabling assembly's handle.
        w_name - Harness name.

    Output Arguments:
        p_harness - The harness handle.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully create harness.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_E_FOUND - Harness with same name already exists.
        PRO_TK_GENERAL_ERROR - Other errors.

*/

extern ProError ProHarnessCablesCollect(
    ProHarness  harness,
    ProCable    **p_cables);
/*
    Purpose: Retrive the cables for specified harness

    Input Arguments:
        harness - The handle of harness.

    Output Arguments:
        p_cables - ProArray of cables's handles. Function allocates memory for 
                   this argument. User must free it's using ProArrayFree.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved cables.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_GENERAL_ERROR - Other error.

*/

extern ProError ProSubharnessCablesCollect(
    ProSubharness  *p_sub_harness,
    ProCable    **p_cables);
/*
    Purpose: Retrieve the cables for specified sub harness

    Input Arguments:
        p_sub_harness - The pointer to the sub harness.

    Output Arguments:
        p_cables - ProArray of cables's handles. Function allocates memory for 
                   this argument. User must free it using ProArrayFree.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved cables.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_GENERAL_ERROR - Other error.

*/

extern ProError ProHarnessLocationsCollect(
    ProAssembly         assy,
    ProHarness          harness,
    ProCablelocation    **p_location_array);
/*
    Purpose: Retrive the locations for specified harness

    Input Arguments:
        assy - The assembly.
        harness - The handle of harness.

    Output Arguments:
        p_location_array - ProArray of cables. Function allocates memory for 
                           this argument. User must free it using ProArrayFree.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved locations.
        PRO_TK_BAD_INPUTS - One or more of the input arguments was invalid
        PRO_TK_GENERAL_ERROR - Other error.

*/

/*==========================================================================*\
        Cable functions
\*==========================================================================*/

extern ProError ProCableHarnessesGet (
    ProAssembly assy,
    ProName    w_cable_name,
    ProHarness  **p_harnesses);
/*
    Purpose: Retrieves the harnesses in the assembly that contain the given 
             cable.

    Input Arguments:
        assy - The assembly handle
        w_cable_name - The cable's name.

    Output Arguments:
        p_harnesses - ProArray of harnesses. Function allocates memory for this 
                      argument. User must free memory by ProArrayFree

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved harnesses.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_NOT_FOUND - No harnesses were found.
        PRO_TK_GENERAL_ERROR - Other error.

*/

extern ProError ProCableColorGet (
    ProCable        *p_cable,      
    ProColor        *p_color);
/*
    Purpose: Returns the cable color.

    Input Arguments:
        p_cable - The handle of cable.

    Output Arguments:
        p_color - The cable's color.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved color.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_GENERAL_ERROR - Other error.

*/

extern ProError ProCableLengthGet (
    ProCable        *p_cable,
    double          *p_length);
/*
    Purpose: Retrieves the length of the specified wire

    Input Arguments:
        p_cable - The cable handle.

    Output Arguments:
        p_length - The wire length.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved length.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_GENERAL_ERROR - The function failed.

*/


extern ProError ProCableByNameGet (
     ProHarness  p_harness,
     ProName     name,
     ProCable    *p_cable);
/*
    Purpose: Returns the cable handle, given its name

    Input Arguments:
        p_harness - The cabling harness.
        name - The name.

    Output Arguments:
        p_cable - The handle of cable.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully initialized the cable.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_E_NOT_FOUND - The function failed to find the cable.
        PRO_TK_GENERAL_ERROR - The function failed.

*/

extern ProError ProCableNameGet (
    ProCable    *p_cable,
    ProName     name);
/*
    Purpose: Returns the cable name

    Input Arguments:
        p_cable - The handle of cable.

    Output Arguments:
        name - The name.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully initialized the cable.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid. 
                            PRO_TK_GENERAL_ERROR- Other error.

*/

extern ProError ProCableTypeGet (
    ProCable        *p_cable,
    ProCableType    *p_type);
/*
    Purpose: Returns the cable type (normal cable, wire, conductor or bundle)

    Input Arguments:
        p_cable - The handle of cable.

    Output Arguments:
        p_type - The cable's type.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved type.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_INVALID_TYPE - Invalid cable type. PRO_TK_GENERAL_ERROR- Other 
                              error.

*/

extern ProError ProNetworkCreate( ProHarness  harness,
                                  ProCable *p_network );
/*
    Purpose: Creates new network in specified harness.

    Input Arguments:
        harness - The handle of harness

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully created the new network 
                          cable.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_E_FOUND - network already exists.
        PRO_TK_GENERAL_ERROR - Other error.

*/

extern ProError ProNetworkGet( ProHarness  harness,
                               ProCable *p_network );
/*
    Purpose: Gets the network in specified harness.

    Input Arguments:
        harness - The handle of harness

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully returned the new network 
                          cable.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_E_NOT_FOUND - network not found.
        PRO_TK_GENERAL_ERROR - Other error.

*/

extern ProError ProCableCreate(
    ProHarness  harness,
    ProSpool    *spool, 
    ProName     cable_name,
    ProCable    *p_cable);
/*
    Purpose: Creates new cable or wire in specified harness. The type of the 
             cable corresponds to the spool type. Required parameters will be 
             created with default values, unless the cable name has been 
             imported from a logical reference, in which case the parameters 
             from the reference are used instead. after finishing the call, now 
             reset the current model back to its status before the call

    Input Arguments:
        harness - The handle of harness
        spool - The spool handle
        cable_name - The cable name

    Output Arguments:
        p_cable - The handle of new cable

    Return Values:
        PRO_TK_NO_ERROR - The function successfully created the new cable.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_E_FOUND - Cable already exists.
        PRO_TK_E_NOT_FOUND - Spool does not exist yet.
        PRO_TK_GENERAL_ERROR - Other error.

*/

extern ProError ProCableAndConductorsCreate(
    ProHarness  harness,
    ProSpool    *spool, 
    ProName     cable_name,
    ProBoolean  create_conductors,
    ProCable    *p_cable);
/*
    Purpose: Creates new cable or wire in specified harness. The type of the 
             cable corresponds to the spool type. It also creates conductors if 
             needed. Required parameters will be created with default values, 
             unless the cable name has been imported from a logical reference, 
             in which case the parameters from the reference are used instead. 
             after finishing the call, now reset the current model back to its 
             status before the call

    Input Arguments:
        harness - The handle of harness
        spool - The spool handle
        cable_name - The cable name
        create_conductors - Create Conductors

    Output Arguments:
        p_cable - The handle of new cable

    Return Values:
        PRO_TK_NO_ERROR - The function successfully created the new cable.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_E_FOUND - Cable already exists.
        PRO_TK_E_NOT_FOUND - Spool does not exist yet.
        PRO_TK_GENERAL_ERROR - Other error.

*/


extern ProError ProBundleCreate(
    ProHarness      harness,
    ProSpool        *spool, 
    ProName         bundle_name,
    ProCable        *p_cables,
    ProBoolean      is_flat,
    ProCable        *p_bundle);
/*
    Purpose: Creates new bundle in specified harness after finishing the call, 
             now reset the current model back to its status before the call.

    Input Arguments:
        harness - The harness handle
        spool - The spool
        bundle_name - The bundles name
        p_cables - The ProArray of cables to add
        is_flat - If PRO_B_TRUE, the bundle is flat. If PRO_B_FALSE, the bundle 
                  is round.

    Output Arguments:
        p_bundle - The created bundle

    Return Values:
        PRO_TK_NO_ERROR - The function successfully created the new bundle.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_E_FOUND - Bundle already exists.
        PRO_TK_E_NOT_FOUND - Spool does not exist.
        PRO_TK_GENERAL_ERROR - Other error.

*/

extern ProError ProBundleCablesCollect(
    ProCable  *p_bundle,
    ProBundleCableLevel   level,
    ProCable    **p_cables);
/*
    Purpose: Retrieves cables

    Input Arguments:
        p_bundle - bundle handle
        level - determines which set of cables to get.

    Output Arguments:
        p_cables - ProArray of bundles. Function allocates memory for this 
                   argument. User must free it using ProArrayFree.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully collected cables.
        PRO_TK_INVALID_TYPE - Invalid type of specified cable (bundle);
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_GENERAL_ERROR - Other error.

*/

extern ProError ProCableLogicalEndsGet(
    ProAssembly     assy,
    ProCable        *p_cable,
    ProSelection    *log_end_1,
    ProSelection    *log_end_2);
/*
    Purpose: Retrieves logical ends of specified cable

    Input Arguments:
        assy - The assembly
        p_cable - The handle of cable

    Output Arguments:
        log_end_1 - The first logical endpoint allocated by the function.
        log_end_2 - The second logical endpoint allocated by the function.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully get parameter.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_E_NOT_FOUND - one or both ends are not defined.
        PRO_TK_GENERAL_ERROR - Other errors.

*/

extern ProError ProCableIsComplete (
    ProCable        *p_cable,
    ProBoolean      *is_complete);
/*
    Purpose: Identifies if a cable is complete.

    Input Arguments:
        p_cable - The cable.

    Output Arguments:
        is_complete - Whether the cable is complete.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully got the cable data.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_GENERAL_ERROR - Other errors.

*/

extern ProError ProCableParameterGet(
    ProAssembly             assy,
    ProCable                *p_cable,
    ProName                 param_name,
    ProCableparam           *p_param);
/*
    Purpose: Retrieves one parameter for the specified cable. The cable 
             parameter must be single valued. Requesting a multi-valued 
             parameter will return PRO_TK_E_NOT_FOUND.

    Input Arguments:
        assy - The assembly
        p_cable - The cable
        param_name - The parameter name

    Output Arguments:
        p_param - The handle of cable parameter

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the parameter.
        PRO_TK_E_NOT_FOUND - cable or parameter with this name does not exist, 
                             or the parameter requested is multi-valued.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_GENERAL_ERROR - Other error

*/

extern ProError ProCableParameterDelete(
    ProAssembly assy,
    ProCable    *p_cable,
    ProName     param_name);
/*
    Purpose: Deletes one parameter for specified cable

    Input Arguments:
        assy - The assembly
        p_cable - The handle of cable
        param_name - The name of the parameter to delete

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully delete parameter.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_GENERAL_ERROR - Other error

*/

extern ProError ProCableParametersCollect(
    ProAssembly             assy,
    ProCable                *p_cable,
    ProCableparam           **p_params);
/*
    Purpose: Retrieves the parameters, including all values associated with 
             multi-valued parameters, for the specified cable

    Input Arguments:
        assy - The assembly
        p_cable - The handle of cable. It should be one of the following types 
                  returned from ProCableTypeGet(): PRO_CABLETYPE_CABLE, 
                  PRO_CABLETYPE_WIRE, PRO_CABLETYPE_BUNDLE, 
                  PRO_CABLETYPE_CONDUCTOR.

    Output Arguments:
        p_params - Pointer to ProArray of parameters.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieves parameters.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_E_NOT_FOUND - Spool with this name does not exist.
        PRO_TK_GENERAL_ERROR - Other errors.

*/

extern ProError ProCableParametersSet(
    ProAssembly             assy,
    ProCable                *p_cable,
    ProCableparam           *params);
/*
    Purpose: Sets parameters for the specified cable

    Input Arguments:
        assy - The assembly
        p_cable - The handle of cable
        params - ProArray of parameters

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully set parameters.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_E_NOT_FOUND - Array does not contain required params or read 
                             only params are changed.
        PRO_TK_GENERAL_ERROR - Other errors.

*/




extern ProError ProCableClearanceCompute (
    ProSelection    sel1,
    ProSelection    sel2,
    ProBoolean      *interference,
    ProPoint3d      pnt_arr[2]);
/*
    Purpose: Determines the clearance of the specified cable, and reports if 
             interference was found

    Input Arguments:
        sel1 - The first selection.
        sel2 - The second selection.

    Output Arguments:
        interference - The interference. This is PRO_B_TRUE if there is no 
                       interference; otherwise, this is PRO_B_FALSE.
        pnt_arr - The coordinates of the closest points.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully clearance.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_GENERAL_ERROR - Other errors.

*/

extern ProError ProCableSegmentsGet (
    ProCable        *p_cable,
    ProCablesegment **p_segs);
/*
    Purpose: Collect cable segments.

    Input Arguments:
        p_cable - The cable.

    Output Arguments:
        p_segs - ProArray of cable segments. The function allocates memory, 
                 user must free it by ProArrayFree.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully get cable data.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_GENERAL_ERROR - Other errors.

*/

extern ProError ProCablesegmentPointsGet (
    ProCablesegment segment,
    ProPoint3d      **p_pnts,
    ProVector       **p_tangents);
/*
    Purpose: Get cable segment points.

    Input Arguments:
        segment - The cable segment.

    Output Arguments:
        p_pnts - ProArray of segment points. User must free memory by 
                 ProArrayFree.
        p_tangents - ProArray of segment tangents. User must free memory by 
                     ProArrayFree.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully get cable segment data.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_GENERAL_ERROR - Other errors.

*/

extern ProError ProCablesegmentIsInBundle (
    ProCablesegment segment,
    ProBoolean      *is_in_bundle,
    ProName          bundle_name);
/*
    Purpose: Identifies whether the cable segment runs into a bundle.

    Input Arguments:
        segment - The cable segment.

    Output Arguments:
        is_in_bundle - Whether the cable runs into a bundle.
        bundle_name - The name of the bundle that the segments runs into, if 
                      is_in_bundle is PRO_B_TRUE. If not, this output should be 
                      ignored.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully get cable segment data.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_GENERAL_ERROR - Other errors.

*/

extern ProError ProCablesegmentIsNew (
    ProCablesegment segment,
    ProBoolean      *is_new);
/*
    Purpose: Identifies whether the cable segment is connected to the previous 
             segment.

    Input Arguments:
        segment - The cable segment.

    Output Arguments:
        is_new - Whether the cable is not connected to the previous segment.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully get cable segment data.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_GENERAL_ERROR - Other errors.

*/

extern ProError ProCablesegmentInfosGet (
    ProCable        *p_cable,
    ProCablesegmentInfo **p_segs);
/*
    Purpose: Collect cable segments with location ids inside the segments.

    Input Arguments:
        p_cable - The cable.

    Output Arguments:
        p_segs - ProArray of cable segments. The function allocates memory, 
                 user must free it by ProArrayFree.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully get cable data.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_GENERAL_ERROR - Other errors.

*/

extern ProError ProCablesegmentInfoPointsGet (
    ProCablesegmentInfo segment,
    ProPoint3d      **p_pnts,
    ProVector       **p_tangents,
    int             **p_loc_ids);
/*
    Purpose: Get cable segment points, tangents and location ids.

    Input Arguments:
        segment - The cable segment.

    Output Arguments:
        p_pnts - ProArray of segment points. User must free memory by 
                 ProArrayFree.
        p_tangents - ProArray of segment tangents. User must free memory by 
                     ProArrayFree.
        p_loc_ids - ProArray of location ids. User must free memory by 
                    ProArrayFree.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully get cable segment data.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_GENERAL_ERROR - Other errors.

*/

extern ProError ProCablesegmentInfoIsInBundle (
    ProCablesegmentInfo segment,
    ProBoolean      *is_in_bundle,
    ProName          bundle_name);
/*
    Purpose: Identifies whether the cable segment with location information 
             runs into a bundle.

    Input Arguments:
        segment - The cable segment.

    Output Arguments:
        is_in_bundle - Whether the cable runs into a bundle.
        bundle_name - The name of the bundle that the segments runs into, if 
                      is_in_bundle is PRO_B_TRUE. If not, this output should be 
                      ignored.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully get cable segment data.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_GENERAL_ERROR - Other errors.

*/

extern ProError ProCablesegmentInfoIsNew (
    ProCablesegmentInfo segment,
    ProBoolean      *is_new);
/*
    Purpose: Identifies whether the cable segment with location information is 
             connected to the previous segment.

    Input Arguments:
        segment - The cable segment.

    Output Arguments:
        is_new - Whether the cable is not connected to the previous segment.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully get cable segment data.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_GENERAL_ERROR - Other errors.

*/

extern ProError ProCableLocationsCollect(
    ProAssembly         assy,
    ProCable            *p_cable,
    ProCablelocation    **p_location_array);
/*
    Purpose: Finds the locations for the specified cable or wire

    Input Arguments:
        assy - The handle to the assembly that contains the cable.
        p_cable - The cable's handle.

    Output Arguments:
        p_location_array - Pointer to ProArray of locations. The function 
                           allocates memory for this argument. To free it, call 
                           the function ProArrayFree.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully get list of ids.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_GENERAL_ERROR - Other errors.

*/

extern ProError ProCablelocationCablesGet(
    ProCablelocation    *p_loc,
    ProCable            **p_cables);
/*
    Purpose: Find cables at the specified location

    Input Arguments:
        p_loc - The location.

    Output Arguments:
        p_cables - Pointer to ProArray of cables. The function allocates memory 
                   for this argument. To free it, call the function 
                   ProArrayFree.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully get list of cables.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_GENERAL_ERROR - Other errors.

*/

extern ProError ProCablelocationTypeGet(
    ProCablelocation        *location,
    ProCablelocationType    *p_type);
/*
    Purpose: Retrive the location's type for specified harness

    Input Arguments:
        location - The cable location.

    Output Arguments:
        p_type - The cable location type.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved locations.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_GENERAL_ERROR - Other error.

*/

extern ProError ProCablelocationPointGet(
    ProCablelocation    *location,
    ProPoint3d          pnt,
    ProVector           tan);
/*
    Purpose: Retrive the location's point for specified harness

    Input Arguments:
        location - The cable location.

    Output Arguments:
        pnt - The cable location's point.
        tan - The cable location's vector.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved locations.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_GENERAL_ERROR - Other error.

*/

/*=====================================================================*\
        Routing functions
\*=====================================================================*/
extern ProError ProCableRoutingStart (
    ProAssembly         assy,
    ProCable            *p_cables,
    ProRouting  *p_cable_route_data);
/*
    Purpose: Initializes routing procedure This function will set the current 
             model to the cabling harness part ProCableRoutingEnd() will reset 
             the current model back to its status before the call

    Input Arguments:
        assy - The assembly
        p_cables - The ProArray of cables to route.

    Output Arguments:
        p_cable_route_data - The cable routing data required for subsequent 
                             function calls to route cables through locations. 
                             The function allocates the space for this 
                             argument.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully start routing.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_GENERAL_ERROR - Other errors.

*/

extern ProError ProCablelocationrefAlloc (
    ProCablelocationType    type,
    ProSelection            *refs,
    ProBoolean              with_axis_dir,
    ProVector               offset,
    ProCablelocationref     *ref);
/*
    Purpose: Allocates and initializes memory for location reference

    Input Arguments:
        type - The location reference type
        refs - The ProArray of ProSelections (If the type is 
               PRO_LOC_TYPE_CONNECTOR, PRO_LOC_TYPE_POINT, PRO_LOC_TYPE_AXIS, 
               PRO_LOC_TYPE_OFFSET, or PRO_LOC_TYPE_LOC, one reference is 
               sufficient).
        with_axis_dir - If PRO_B_TRUE, follow the axis direction. If 
                        PRO_B_FALSE, go in the opposite direction.
        offset - The offset

    Output Arguments:
        ref - The location reference

    Return Values:
        PRO_TK_NO_ERROR - The function successfully allocated memory.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_OUT_OF_MEMORY - Not enough memory.

*/
  
extern ProError ProCablelocationrefFree (
    ProCablelocationref      ref);
/*
    Purpose: Releases memory that allocated by ProCablelocationrefAlloc

    Input Arguments:
        ref - The location reference.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully allocated memory.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_OUT_OF_MEMORY - Not enough memory.

*/

extern ProError ProCableThruLocationRoute (
    ProRouting     cable_route_data,
    ProCablelocationref ref,
    ProCablelocation    *p_location,
    ProCablelocation    *second_axis_location);
/*
    Purpose: Finds or creates a cable location feature, and routes cables 
             through it

    Input Arguments:
        cable_route_data - The cable routing data required for subsequent
        ref - The reference used for the routing, obtained from 
              ProCablelocationrefAlloc().

    Output Arguments:
        p_location - The location.
        second_axis_location - If routing through an axis, the route generates 
                               two locations. Otherwise,this is NULL.

    Return Values:
        PRO_TK_NO_ERROR - The function routed the cable.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_GENERAL_ERROR - Other errors.

*/

extern ProError ProCableRoutingEnd (
    ProRouting     cable_route_data);
/*
    Purpose: Ends the cable routing this function will reset the current model 
             back to its status before the call to ProCableRoutingStart()

    Input Arguments:
        cable_route_data - The cable routing data.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully ends routing.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_GENERAL_ERROR - Other errors.

*/

typedef enum {
  PRO_CABLECOSMTYPE_TAPE,
  PRO_CABLECOSMTYPE_MARKER,
  PRO_CABLECOSMTYPE_TIE_WRAP,
  PRO_CABLECOSMTYPE_BRANCH_TAPE
} ProCableCosmeticType;

extern ProError ProCableCosmeticFeatureCreate (ProCableCosmeticType type,
                                               ProSelection reference,
                                               ProName      feature_name,
                                               ProName      spool_name,
                                               ProFeature  *cosm_feature);
/*
    Purpose: Create a cabling cosmetic feature (a tape, marker, or tie wrap).

    Input Arguments:
        type - The type of cabling cosmetic feature to create
        reference - The selected cable location or cable segment point to use 
                    for the feature creation. If creating a tape feature this 
                    must contain a cable location. If creating a marker, this 
                    must contain a point on a cable segment. If creating a tie 
                    wrap, this could be a cable location or a point on a cable 
                    segment.
        feature_name - The name of the cosmetic feature, can not be NULL.
        spool_name - The name of the spool to be used for tape feature. NULL 
                     for tie wrapper and marker.

    Output Arguments:
        cosm_feature - The new cosmetic feature.

    Return Values:
        PRO_TK_NO_ERROR - The function created the cosmetic feature.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_INVALID_TYPE - The type of the reference selection is not valid 
                              for the type of cosmetic feature to be created.
        PRO_TK_E_FOUND - A feature with the same name already exists in the 
                         model.

*/

extern ProError ProCableTapeWindsSet (ProFeature* tape_feat, int num_winds);
/*
    Purpose: Sets the number of winds in a cabling cosmetic tape feature.

    Input Arguments:
        tape_feat - The tape feature.
        num_winds - The number of winds.

    Output Arguments:
        none

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

*/

extern ProError ProCableTapeWindsGet (ProFeature* tape_feat, int* num_winds);
/*
    Purpose: Gets the number of winds in a cabling cosmetic tape feature.

    Input Arguments:
        tape_feat - The tape feature.

    Output Arguments:
        num_winds - The number of winds.

    Return Values:
        PRO_TK_NO_ERROR - The function succeeded.
        PRO_TK_BAD_INPUTS - The input argument was invalid.

*/

typedef ProCablelocation ProCablelocationPair [2];

extern ProError ProCableSectionsDelete (ProCablelocationPair boundaries,
                                        ProCable* cable_array);
/*
    Purpose: Deletes the sections of the designated cables which lie between 
             the designated locations. Does not delete loom bundle cable 
             sections.

    Input Arguments:
        boundaries - array of two cable locations.
        cable_array - ProArray of cables from which to delete sections. If 
                      NULL, all cable sections between the two locations will 
                      be deleted.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully deleted the cable sections.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_BAD_CONTEXT - One or more input cables do not pass through the 
                             supplied locations.
        PRO_TK_INVALID_ITEM - A fixed-length cable section could not be deleted 
                              because it extended beyond the cable location.
        PRO_TK_GENERAL_ERROR - A regeneration failure occurred and the deletion 
                               was aborted.
        PRO_TK_NO_LICENSE - The Pro/CABLING license was not available.

*/


extern ProError ProHarnessTessellationGet (ProHarness harness,
                                           ProSurfaceTessellationInput input_data,
                                           ProTessellation* tessellation);
/*
    Purpose: Obtains the tessellation for the thick cables in the cable 
             harness.

    Input Arguments:
        harness - The harness.
        input_data - The input data used for the tessellation.

    Output Arguments:
        tessellation - The tessellation for the harness cables.

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

*/

LIB_COREUTILS_API  ProError ProCableparammemberFree(ProCableparam *cable_param);
/*
    Purpose: Free any allocated memory in a ProCableparam. Frees array of 
             ProCableparammember* inside ProCableparam.

    Input Arguments:
        cable_param - Pointer of ProCableparam type.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function succeeded.
        PRO_TK_BAD_INPUTS - The input argument was invalid.

*/

LIB_COREUTILS_API  ProError ProCableparamproarrayFree(ProCableparam **cable_params);
/*
    Purpose: Free any allocated memory in array of ProCableparam. Also frees 
             ProCableparammember* inside each ProCableparam.

    Input Arguments:
        cable_params - The address of the array of ProCableparam type.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function succeeded.
        PRO_TK_BAD_INPUTS - The input argument was invalid.

*/

extern ProError ProAsmcompIsHarness (ProAsmcomppath *p_comp, ProBoolean *p_is_harness);
/*
    Purpose: check if the component is a harness part.

    Input Arguments:
        p_comp - The component.

    Output Arguments:
        p_is_harness - TRUE if the component is a harness.

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

*/

extern ProError ProAsmcompIsConnector (ProAsmcomppath *p_comp, ProBoolean *p_is_connector);
/*
    Purpose: check if the component is a cabling connector.

    Input Arguments:
        p_comp - The component.

    Output Arguments:
        p_is_connector - TRUE if the component is a cabling connector.

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

*/

extern ProError ProFeatureIsCableCosmetic (ProFeature *cosm_feature, ProBoolean *p_is_cosm_feat);
/*
    Purpose: check if the feature is a cabling cosmetic feature.

    Input Arguments:
        cosm_feature - The feature pointer.

    Output Arguments:
        p_is_cosm_feat - TRUE if the feature is a cabling cosmetic feature.

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

*/

extern ProError ProCablelocationIsAttachToHarness (ProCablelocation *p_location, ProBoolean *p_is_att_loc);
/*
    Purpose: check if the location is a cabling "attach to harness" location.

    Input Arguments:
        p_location - The location pointer.

    Output Arguments:
        p_is_att_loc - TRUE if the location is a cabling "attach to harness" 
                       location.

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

*/

extern ProError ProCablelocationAttachToHarnessComponentGet (ProCablelocation *p_location, ProAsmcomppath *p_comp, int *p_ent_id);
/*
    Purpose: Return the component which the "attach to harness" location was 
             dependent on.

    Input Arguments:
        p_location - The feature pointer.

    Output Arguments:
        p_comp - The component of the "attach to harness" location.
        p_ent_id - the geometry (csys or axis) id in the component where the 
                   the location was created on.

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

*/
extern ProError ProCableTessellationGet (ProCable *cable,
                                         ProSurfaceTessellationInput input_data,
                                         ProTessellation* tessellation);
/*
    Purpose: Obtains the tessellation for the input cable. 
             <p><b>NOTE: </b> Set config option "display_thick_cables" to "yes" 
             before using this API. </p>

    Input Arguments:
        cable - The input cable.
        input_data - The input data used for the tessellation.

    Output Arguments:
        tessellation - The tessellation for the cable.

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

*/
extern ProError ProCableCosmeticfeatureEntityGet(
    ProCable   *cosm_feature,
    ProCurve    **p_ent);
/*
    Purpose: Obtains the entity pointer for the input cable cosmetic feature.

    Input Arguments:
        cosm_feature - The input cable cosmetic feature pointer.

    Output Arguments:
        p_ent - The entity for the cosmetic feature.

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

*/
extern ProError ProCableCosmeticfeatureThicknessGet(
    ProCable   *cosm_feature,
    double       *p_thickness);
/*
    Purpose: Obtains the thickness for the input cable cosmetic feature.

    Input Arguments:
        cosm_feature - The input cable cosmetic feature pointer.

    Output Arguments:
        p_thickness - The thickness for the cosmetic feature.

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

*/
extern ProError ProCableCosmeticfeatureReferencethicknessGet(
    ProCable   *cosm_feature,
    double       *p_ref_thickness);
/*
    Purpose: Obtains the thickness of the cable(s) wrapped by the input cable 
             cosmetic feature.

    Input Arguments:
        cosm_feature - The input cable cosmetic feature pointer.

    Output Arguments:
        p_ref_thickness - The reference thickness for the cosmetic feature.

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

*/
extern ProError ProHarnessSubharnessesCollect(
    ProAssembly    p_assem,
    ProHarness     p_harness,
    ProSubharness  **p_sub_harnesses);
/*
    Purpose: Collect all subharnesses in the input harness part.

    Input Arguments:
        p_assem - The input assembly.
        p_harness - The input harness part.

    Output Arguments:
        p_sub_harnesses - Pointer to ProArray of ProSubharness. The function 
                          allocates memory for this argument. Use ProArrayFree 
                          to free it.

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

*/

extern ProError ProCablingNeutralwirelistImport (ProAssembly    p_assem,
                                                 ProPath        filename );
/*
    Purpose: Import neutral wire list from file.

    Input Arguments:
        p_assem - The input assembly.
        filename - The input file name, including the extension. this can be 
                   the full path to the file.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully processed the file.
        PRO_TK_GENERAL_ERROR - A general error occurred and the function 
                               failed.

*/

extern ProError ProCablingSchematicsLayerNamesGet( ProPath        filename,
                                                   ProName **layer_names );
/*
    Purpose: Gets the Creo Schematics layer list from the file.

    Input Arguments:
        filename - The input file name, including the extension. this can be 
                   the full path to the file.

    Output Arguments:
        layer_names - Pointer to Pro Array contain the layer names in file

    Return Values:
        PRO_TK_NO_ERROR - The function successfully processed the file.
        PRO_TK_GENERAL_ERROR - A general error occurred and the function 
                               failed.

*/

extern ProError ProCablingSchematicswirelistImport( ProAssembly    p_assem,
                                                    ProPath        filename,
                                                    ProName *layer_names );
/*
    Purpose: Import Creo Schematics wire list from file.

    Input Arguments:
        p_assem - The input assembly.
        filename - The input file name, including the extension. this can be 
                   the full path to the file.
        layer_names - Pro Array contain the layer names to import. Can be NULL 
                      and in this case we will import the entire file

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully processed the file.
        PRO_TK_GENERAL_ERROR - A general error occurred and the function 
                               failed.

*/

extern ProError ProCableLocationsOnSegEndGet (
  ProCable cable,
  ProCablelocationPair **p_boundries);
/*
    Purpose: Get the locations in the end of each cable segment of the cable

    Input Arguments:
        cable - The cable for which the end locations will be returned

    Output Arguments:
        p_boundries - pointer to ProArray of two cable locations, start and end 
                      location of each cable segment.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully return the boundries
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_GENERAL_ERROR - A general error occurred and the function 
                               failed.

*/


extern ProError ProCablingIsHarness (ProMdl *p_mdl, ProBoolean *p_is_harness);
/*
    Purpose: check if the model handle is a harness part.

    Input Arguments:
        p_mdl - The model handle.

    Output Arguments:
        p_is_harness - TRUE if the model is a harness.

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

*/




extern ProError ProCableTapeFeatSpoolGet (ProFeature *tape_feat,
                                          ProSpool   *p_spool);
/*
    Purpose: Get tape feature spool

    Input Arguments:
        tape_feat - The tape feature.

    Output Arguments:
        p_spool - Will be filled with the tape feat spool data.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully return the spool
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_GENERAL_ERROR - A general error occurred and the function 
                               failed.

*/


extern ProError ProCableCosmeticFeatureTypeGet( ProFeature  *cosm_feature,
                                                ProCableCosmeticType *p_cosm_type );
/*
    Purpose: Return the cosmetic feature type

    Input Arguments:
        cosm_feature - The cosmetic feature

    Output Arguments:
        p_cosm_type - the type of the cosmetic feature

    Return Values:
        PRO_TK_NO_ERROR - The function successfuly retrieve the cosmatic 
                          feature type
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_INVALID_TYPE - feature is not a cosmetic feature type

*/


extern ProError ProCableCosmeticDistanceGet( ProFeature  *cosm_feature, 
                                             double *p_offset, ProBoolean  *p_start );
/*
    Purpose: Return the position of a cosmetic feature (either marker or tie 
             wrap) which is set according to a distance on a segment

    Input Arguments:
        cosm_feature - The cosmetic feature

    Output Arguments:
        p_offset - The distance from the segment start / end position
        p_start - Is the distance from the start position

    Return Values:
        PRO_TK_NO_ERROR - The function return the cosmatic feature distance
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_INVALID_TYPE - feature is not a marker, tie wrap or is not 
                              placed by distance on segment.

*/


extern ProError ProCablelocationMaxDiameterGet( ProCablelocation *location, double *max_dia );
/*
    Purpose: Retrieve the location's max diameter for specified harness

    Input Arguments:
        location - The cable location.

    Output Arguments:
        max_dia - max diameter.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved diameter.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_GENERAL_ERROR - Other error.

*/
extern ProError ProCablelocationHeightDimensionGet( ProCablelocation *location, ProDimension *height_dim );
/*
    Purpose: Retrieve the location's height dimension from reference for 
             specified harness

    Input Arguments:
        location - The cable location.

    Output Arguments:
        height_dim - height dimension.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved diameter.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_BAD_CONTEXT - Specified location does not have height dimension.
        PRO_TK_GENERAL_ERROR - Other error.

*/

extern ProError ProConnectorRefModelNameGet(ProConnector *p_connector, ProMdlName p_ref_model_name);
/*
    Purpose: Gets connector's ref model name.

    Input Arguments:
        p_connector - The connector handle.

    Output Arguments:
        p_ref_model_name - Ref model name.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully gets ref model name.
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_E_NOT_FOUND - Ref model is not found for connector.
        PRO_TK_GENERAL_ERROR - Other errors.

*/

extern ProError ProCableCurvesGet( ProCable *cbl_feat, ProBoolean inc_bundle, ProCurve **p_curves );
/*
    Purpose: Retrieves the trajectory entities for the specified feature.

    Input Arguments:
        cbl_feat - The cable for which the ProCurves will be returned
        inc_bundle - should the function return ProCurve of the bundles in 
                     which the cable passes

    Output Arguments:
        p_curves - A ProArray of the curves.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the curves
        PRO_TK_BAD_INPUTS - One or more of the arguments was invalid.
        PRO_TK_GENERAL_ERROR - Other errors.

*/


PRO_END_C_DECLS

#endif  /* PRO_CABLING_H */