#ifndef PROLAYER_H
#define PROLAYER_H

#include <ProObjects.h>
#include <ProView.h>

PRO_BEGIN_C_DECLS

typedef enum
{
  PRO_LAYER_NONE              = PRO_VALUE_UNUSED, /* use to compare to not initialized value. */
  PRO_LAYER_SOLID_GEOM        = PRO_SOLID_GEOMETRY, /* Replace by PRO_LAYER_MODEL_BODIES internally. */
  PRO_LAYER_MODEL_BODIES      = PRO_MODEL_BODIES,
  PRO_LAYER_PART              = PRO_PART,    /* This layer item type is no 
                                                longer supported */
  PRO_LAYER_FEAT              = PRO_FEATURE,
  PRO_LAYER_DIMENSION         = PRO_DIMENSION,
  PRO_LAYER_REF_DIMENSION     = PRO_REF_DIMENSION,
  PRO_LAYER_GTOL              = PRO_GTOL,
  PRO_LAYER_SUB_ASSEMBLY      = PRO_SUB_ASSEMBLY,
  PRO_LAYER_QUILT             = PRO_QUILT,
  PRO_LAYER_CURVE             = PRO_CURVE,
  PRO_LAYER_POINT             = PRO_POINT,
  PRO_LAYER_NOTE              = PRO_NOTE,
  PRO_LAYER_IPAR_NOTE         = PRO_IPAR_NOTE,
  PRO_LAYER_SYMBOL            = PRO_SYMBOL_INSTANCE,
  PRO_LAYER_DRAFT             = PRO_DRAFT_ENTITY,
  PRO_LAYER_DGM_OBJECT        = PRO_DIAGRAM_OBJECT,
  PRO_LAYER_DRAFT_GROUP       = PRO_DRAFT_GROUP,
  PRO_LAYER_LAYER             = PRO_LAYER,
  PRO_LAYER_DATUM_PLANE       = PRO_DATUM_PLANE,
  PRO_LAYER_DRAW_TABLE        = PRO_DRAW_TABLE,
  PRO_LAYER_DATUM_TEXT        = PRO_DATUM_TEXT, /* Supports datum plane tags. 
                                                   Use the feature id. */
  PRO_LAYER_ENTITY_TEXT       = PRO_ENTITY_TEXT,/* Supports datum entity tags 
                                                   (except for datum plane). 
                                                   Use the item id. */
  PRO_LAYER_SURF_FIN          = PRO_SURF_FIN,
  PRO_LAYER_DRAFT_DATUM       = PRO_DRAFT_DATUM,
  PRO_LAYER_SNAP_LINE         = PRO_SNAP_LINE,
  PRO_LAYER_ANNOT_ELEM        = PRO_ANNOTATION_ELEM,
  PRO_LAYER_XSEC              = PRO_XSEC,        /* Reserved for internal use */
  PRO_LAYER_SET_DATUM_TAG     = PRO_SET_DATUM_TAG,
  PRO_LAYER_SKETCH_ENTITY     = PRO_SKETCH_ENTITY,
  PRO_LAYER_SKETCH_CONSTRAINT = PRO_SKETCH_CONSTRAINT,
  PRO_LAYER_LAYOUT_TAG        = PRO_LAYOUT_TAG,   /* for internal use */
  PRO_LAYER_LAYOUT_NODE       = PRO_LAYOUT_NODE,  /* for internal use */
  PRO_LAYER_LAYOUT_WP         = PRO_LAYOUT_WP,    /* for internal use */
  PRO_LAYER_BODY              = PRO_BODY

} ProLayerType;

typedef enum default_layer_type
{
   PRO_DEFLAYER_NONE = -1,
   PRO_DEFLAYER_ASSEM_MEMBER = 0,
   PRO_DEFLAYER_COMP_DESIGN_MODEL,
   PRO_DEFLAYER_COMP_WORKPIECE,
   PRO_DEFLAYER_COMP_FIXTURE,
   PRO_DEFLAYER_GEOM_FEAT,
   PRO_DEFLAYER_NOGEOM_FEAT,
   PRO_DEFLAYER_COSM_SKETCH,
   PRO_DEFLAYER_AXIS,
   PRO_DEFLAYER_SURFACE,
   PRO_DEFLAYER_DATUM,
   PRO_DEFLAYER_POINT,
   PRO_DEFLAYER_CURVE,
   PRO_DEFLAYER_CSYS,
   PRO_DEFLAYER_FEATURE,
   PRO_DEFLAYER_HOLE_FEAT,
   PRO_DEFLAYER_ROUND_FEAT,
   PRO_DEFLAYER_CHAMFER_FEAT,
   PRO_DEFLAYER_SLOT_FEAT,
   PRO_DEFLAYER_CUT_FEAT,
   PRO_DEFLAYER_PROTRUSION_FEAT,
   PRO_DEFLAYER_RIB_FEAT,
   PRO_DEFLAYER_DRAFT_FEAT,
   PRO_DEFLAYER_SHELL_FEAT,
   PRO_DEFLAYER_CORN_CHAMF_FEAT,
   PRO_DEFLAYER_ASSY_CUT_FEAT,
   PRO_DEFLAYER_TRIM_LINE_FEAT,
   PRO_DEFLAYER_COSM_ROUND_FEAT,
   PRO_DEFLAYER_COPY_GEOM_FEAT,
   PRO_DEFLAYER_WELD,
   PRO_DEFLAYER_DIM,
   PRO_DEFLAYER_PARAMETER_DIM,
   PRO_DEFLAYER_DRIVEN_DIM,
   PRO_DEFLAYER_DRAFT_DIM,
   PRO_DEFLAYER_REFDIM,
   PRO_DEFLAYER_PART_REFDIM,
   PRO_DEFLAYER_DRAFT_REFDIM,
   PRO_DEFLAYER_CURVE_ENT,
   PRO_DEFLAYER_NOTE,
   PRO_DEFLAYER_GTOL,
   PRO_DEFLAYER_SYMBOL,
   PRO_DEFLAYER_SFIN,
   PRO_DEFLAYER_DRAFT_ENTITY,
   PRO_DEFLAYER_DRAFT_CONSTR,
   PRO_DEFLAYER_DRAFT_GEOM,
   PRO_DEFLAYER_DRAFT_HIDDEN,
   PRO_DEFLAYER_DRAFT_OTHERS,
   PRO_DEFLAYER_DRAFT_GRP,
   PRO_DEFLAYER_DRAFT_DTM,
   PRO_DEFLAYER_QUILT,
   PRO_DEFLAYER_DGM_WIRE,
   PRO_DEFLAYER_DGM_CONN_COMP,
   PRO_DEFLAYER_DGM_RAIL,
   PRO_DEFLAYER_DGM_HIGHWAY,
   PRO_DEFLAYER_DETAIL_ITEM,
   PRO_DEFLAYER_DATUM_POINT,
   PRO_DEFLAYER_DATUM_PLANE,
   PRO_DEFLAYER_SNAP_LINE,
   PRO_DEFLAYER_DWG_TABLE,
   PRO_DEFLAYER_THREAD_FEAT,
   PRO_DEFLAYER_SOLID_GEOM,
   PRO_DEFLAYER_EXT_GCPY_FEAT,
   PRO_DEFLAYER_SKELETON,
   PRO_DEFLAYER_RIBBON_FEAT,
   PRO_DEFLAYER_INTCHG_FUNCT,
   PRO_DEFLAYER_INTCHG_SIMP,
   PRO_DEFLAYER_ALL_2D_ITEMS,
   PRO_DEFLAYER_ANNOT_ELEM, 
   PRO_DEFLAYER_AXIS_ENT, 
   PRO_DEFLAYER_CSYS_ENT,     
   PRO_DEFLAYER_3D_ITEMS,
   PRO_DEFLAYER_SET_DATUM_TAG,
   PRO_DEFLAYER_HOLE_QUILT,
   PRO_DEFLAYER_AE_DRIVING_DIM,
   PRO_DEFLAYER_DRAFT_XSEC,
   PRO_DEFLAYER_BODY
}  ProDefLayerType;

typedef enum layer_item_owner_type
{
   PRO_LAYITEM_FROM_MODEL = 0,
   PRO_LAYITEM_FROM_PATH
}  ProLayerItemOwnerType;

typedef enum _pro_layitem_status
{
   PRO_LAY_ITEM_STATUS_NONE          =  (0),
   PRO_LAY_ITEM_STATUS_INCLUDE       =  (1<<0),
   PRO_LAY_ITEM_STATUS_EXCLUDE       =  (1<<1),
   PRO_LAY_ITEM_STATUS_ADDED_BY_RULE =  (1<<2)
} ProLayerItemStatus;

typedef struct layer_item_owner
{
   ProLayerItemOwnerType    owner_type;
   union
   {
      ProMdl                layitem_model;
      ProAsmcomppath        layitem_path;
   }  owner_union;
}  ProLayerItemOwner;

typedef struct
{
  ProLayerType       type;
  int                id;
  ProLayerItemOwner  owner;
} ProLayerItem;

typedef enum
{
  PRO_LAYER_TYPE_NONE      =  -1, /* The selected layer is displayed. This is
                                     the default display status. */ 
  PRO_LAYER_TYPE_NORMAL    =   1, /* Shows the selected layer */
  PRO_LAYER_TYPE_DISPLAY   =   2, /* Isolates the selected layer */ 
  PRO_LAYER_TYPE_BLANK     =   3, /* Blanks the selected layer */
  PRO_LAYER_TYPE_HIDDEN    =   5, /* Makes the components in the hidden layers
                                     blanked. Applicable in the assembly
                                     mode only. */ 
  PRO_LAYER_TYPE_SKIP    =  6     /* Reserved for future use. */ 
} ProLayerDisplay;


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

extern ProError ProLayerCreate (
    ProMdl owner,
    ProName layer_name,
    ProLayer* layer );
/*
    Purpose: Creates a new layer in the specified object.

    Input Arguments:
        owner - The model in which to create the layer.
        layer_name - The name of the layer.
        layer - The structure into which Creo Parametric will write the layer 
                information. You must allocate the space for this structure.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully created the new layer.
        PRO_TK_INVALID_NAME - You specified an invalid layer name.
        PRO_TK_E_FOUND - A layer with the specified name already exists.
        PRO_TK_GENERAL_ERROR - A general error occurred and the function 
                               failed.

*/

extern ProError ProLayerDelete ( ProLayer* layer );
/*
    Purpose: Deletes the specified layer from the object.

    Input Arguments:
        layer - The name of the layer to delete

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully deleted the layer.
        PRO_TK_INVALID_NAME - You specified an invalid layer name.
        PRO_TK_E_NOT_FOUND - The system could not find a layer with the 
                             specified name.
        PRO_TK_GENERAL_ERROR - A general error occurred and the function 
                               failed.

*/

extern ProError ProLayerItemsGet ( ProLayer*      layer,
                                   ProLayerItem** p_layeritem,
                                   int*           p_count);
/*
    Purpose: This function is deprecated.Use ProLayerItemsPopulate() instead. 
             Retrieves the items on the specified layer.

    Input Arguments:
        layer - The name of the layer.

    Output Arguments:
        p_layeritem - An array that contains the types and identifiers of the 
                      items on the layer. The function allocates the memory for 
                      this argument. Use ProArrayFree() to free the allocated 
                      memory.
        p_count - The number of items on the specified layer.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the information.
        PRO_TK_BAD_INPUTS - The input argument is invalid.
        PRO_TK_E_NOT_FOUND - A layer with the specified name was not found.
        PRO_TK_GENERAL_ERROR - A general error occurred and the function 
                               failed.
        PRO_TK_OUT_OF_MEMORY - The layer has too many items to report. 
                               p_layer_item and p_count are filled with the 
                               maximum number of items.

*/

extern ProError ProLayerDisplaystatusGet( ProLayer        *layer,
                                          ProLayerDisplay *display_status );
/*
    Purpose: Retrieves the visibility status for the specified layer.

    Input Arguments:
        layer - The layer whose status you want to retrieve

    Output Arguments:
        display_status - The display status

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the information.
        PRO_TK_BAD_INPUTS - The input argument is invalid.
        PRO_TK_E_NOT_FOUND - The specified layer was not found.
        PRO_TK_INVALID_NAME - You specified an invalid layer name.

*/

extern ProError ProLayerSavedstatusGet( ProLayer        *layer,
                                        ProLayerDisplay *saved_status );
/*
    Purpose: Retrieves the saved status for the specified layer.

    Input Arguments:
        layer - The layer whose status you want to retrieve

    Output Arguments:
        saved_status - The saved status

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the information.
        PRO_TK_BAD_INPUTS - The input argument is invalid.
        PRO_TK_E_NOT_FOUND - The specified layer was not found.
        PRO_TK_INVALID_NAME - You specified an invalid layer name.

*/

extern ProError ProDwgLayerSavedstatusGet( ProLayer        *layer,
                                           ProView          view,
                                           ProLayerDisplay *saved_status );
/*
    Purpose: Retrieves the saved status for the specified layer and view.

    Input Arguments:
        layer - The layer whose status you want to retrieve
        view - The view of drawing whose layer saved status is requested

    Output Arguments:
        saved_status - The saved status

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

*/

extern ProError ProLayerItemAdd ( ProLayer*     layer,
                                  ProLayerItem* layer_item );
/*
    Purpose: Adds the specified item to a layer.

    Input Arguments:
        layer - The layer to which to add the item
        layer_item - The item to add

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully added the item.
        PRO_TK_BAD_INPUTS - One or more of the input arguments are invalid.
        PRO_TK_INVALID_NAME - You specified an invalid layer name.
        PRO_TK_INVALID_TYPE - You specified an invalid type in the 
                              <i>ProLayerItem</i> structure.
        PRO_TK_GENERAL_ERROR - The specified layer was not found.

*/

extern ProError ProLayerItemAddNoUpdate ( ProLayer*     layer,
                                          ProLayerItem* layer_item );
/*
    Purpose: Adds the specified item to a layer and does not do model tree 
             update.

    Input Arguments:
        layer - The layer to which to add the item
        layer_item - The item to add

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully added the item.
        PRO_TK_BAD_INPUTS - One or more of the input arguments are invalid.
        PRO_TK_INVALID_NAME - You specified an invalid layer name.
        PRO_TK_INVALID_TYPE - You specified an invalid type in the 
                              <i>ProLayerItem</i> structure.
        PRO_TK_GENERAL_ERROR - The specified layer was not found.

*/

extern ProError ProLayerItemRemove ( ProLayer* layer,
                                     ProLayerItem* layer_item );
/*
    Purpose: Removes the specified item from the layer.

    Input Arguments:
        layer - The layer from which to remove the item
        layer_item - The layer item to be deleted

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully removed the item.
        PRO_TK_E_NOT_FOUND - The specified layer was not found.
        PRO_TK_INVALID_NAME - You specified an invalid layer name.
        PRO_TK_BAD_INPUTS - One or more of the arguments are invalid.
        PRO_TK_INVALID_TYPE - You specified an invalid layer item type.
        PRO_TK_GENERAL_ERROR - A general error occurred and the function 
                               failed.

*/

extern ProError ProLayerItemRemoveNoUpdate ( ProLayer* layer,
                                             ProLayerItem* layer_item );
/*
    Purpose: Removes the specified item from the layer and does not do model 
             tree update.

    Input Arguments:
        layer - The layer from which to remove the item
        layer_item - The layer item to be deleted

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully removed the item.
        PRO_TK_E_NOT_FOUND - The specified layer was not found.
        PRO_TK_INVALID_NAME - You specified an invalid layer name.
        PRO_TK_BAD_INPUTS - One or more of the arguments are invalid.
        PRO_TK_INVALID_TYPE - You specified an invalid layer item type.
        PRO_TK_GENERAL_ERROR - A general error occurred and the function 
                               failed.

*/

extern ProError ProLayerDisplaystatusSet ( 
                                            ProLayer*       layer,
                                            ProLayerDisplay display_status);
/*
    Purpose: Sets the display status of the specified layer.
             <p> NOTE: 
             <p> This is a temporary setting. It will be lost after you save or 
             retrieve a model. To change the display status permanently, call 
             the function <b>ProLayerDisplaystatusSave()</b>.

    Input Arguments:
        layer - The layer whose status you want to set
        display_status - The display status

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully set the status.
        PRO_TK_BAD_INPUTS - Either one or more of the input arguments are 
                            invalid, or <i>layer->owner</i> is NULL.
        PRO_TK_INVALID_NAME - You specified an invalid layer name.
        PRO_TK_GENERAL_ERROR - The specified layer was not found.
        PRO_TK_CANT_MODIFY - display status of the layer cannot be changed

    See Also:
        ProLayerDisplaystatusSave()
*/

extern ProError ProLayerDisplaystatusNoUpdateSet( 
                                 ProLayer        *layer,
                                 ProLayerDisplay display_status,
                                 ProBoolean      *is_update_tree_needed);
/*
    Purpose: Sets the layer display status but does not update the model tree.

    Input Arguments:
        layer - The layer whose status you want to set
        display_status - The display status

    Output Arguments:
        is_update_tree_needed - Model tree should be update.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully set the status.
        PRO_TK_BAD_INPUTS - One or more of the input arguments are invalid
        PRO_TK_E_NOT_FOUND - The specified layer was not found.
        PRO_TK_CANT_MODIFY - display status of the layer cannot be changed

*/

extern ProError ProLayerDisplaystatusUpdate( ProMdl owner_model );
/*
    Purpose: Updates the model tree for the changes to the display status of 
             layers.

    Input Arguments:
        owner_model - The layer owner model.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully update the tree.

*/

typedef ProError (*ProLayerAction)( ProLayer* layer,
				    ProAppData app_data);
/*
    Purpose: This is the generic function for visiting and filtering 
             <i>ProLayers</i>.

    Input Arguments:
        layer - The <i>ProLayer</i> being visited
        app_data - The user data passed to the visit function

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - Call the visit function.
        PRO_TK_GENERAL_ERROR - Stop visiting.

*/


extern ProError ProMdlLayerVisit ( ProMdl model,
				   ProLayerAction visit_action,
				   ProLayerAction filter_action,
				   ProAppData app_data );
/*
    Purpose: Calls the specified filter and action functions for each layer in 
             the model.

    Input Arguments:
        model - The model.
        visit_action - The action to perform on each layer. If it returns 
                       anything other than PRO_TK_NO_ERROR, visiting stops.
        filter_action - The filter function. If NULL, all layers are visited 
                        using the action function.
        app_data - The application data passed to the visiting and filter 
                   functions.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function visited all the layers.
        PRO_TK_BAD_INPUTS - One or more of the arguments are invalid.
        Other - Any other value is the status returned by the last executed 
                callback (<i>filter_action</i> or <i>visit_action</i>).

*/

extern ProError ProMdlLayerGet( ProMdl owner,
				ProName layer_name,
				ProLayer* layer );
/*
    Purpose: Returns the handle of a layer, given its name and owner.

    Input Arguments:
        owner - The model that contains the layer
        layer_name - The name of the layer

    Output Arguments:
        layer - The layer

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the layer.
        PRO_TK_BAD_INPUTS - One or more of the input arguments are invalid.
        PRO_TK_E_NOT_FOUND - The specified <i>layer_name</i> does not exist in 
                             <i>owner</i>.

*/

extern ProError ProLayerItemInit( ProLayerType    type,
                                  int             id,
				  ProMdl          owner,
				  ProLayerItem   *item );
/*
    Purpose: Initializes the layer item structure. You should use this function 
             in all situations except one special case, which is covered by the 
             function <b>ProDwgLayerItemInit()</b>.

    Input Arguments:
        type - The item type
        id - The item identifier
        owner - The model that owns the item. Cannot be NULL

    Output Arguments:
        item - The layer item. Cannot be NULL.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully initialized the structure.
        PRO_TK_BAD_INPUTS - One or more of the input arguments are invalid.
        PRO_TK_NOT_EXIST - Item with such identifier and type does not exist.

    See Also:
        ProDwgLayerItemInit()
*/

extern ProError ProDwgLayerItemInit( ProLayerType    type,
                                     int             id,
				     ProAsmcomppath *owner,
				     ProLayerItem   *item );
/*
    Purpose: Initializes a layer item structure for the singular case when all 
             of the following are true:
             <ul> 
             <li>The layer owner is a drawing. 
             <li>The layer item owner is an assembly. 
             <li>The layer item is a component. 
             <li>You want to control the display status of this component only 
             in a subassembly specified by the given path (<i>owner</i>).
             </ul>
             <p> In all other situations, use the function 
             <b>ProLayerItemInit()</b>.

    Input Arguments:
        type - The item type.
        id - The item identifier.
        owner - The owner of the item. You can have <i>table_num</i> greater 
                than 0 for type PRO_LAYER_SUB_ASSEMBLY only.

    Output Arguments:
        item - The layer item.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully initialized the structure.
        PRO_TK_BAD_INPUTS - One or more of the input arguments are invalid.

    See Also:
        ProLayerItemInit()
*/

extern ProError ProLayerDisplaystatusSave( ProMdl owner );
/*
    Purpose: Permanently saves all the changes to the display status of all 
             layers in the owner, and all its submodels (and views, for 
             drawings).

    Input Arguments:
        owner - The model/layer owner

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully saved all the layer status 
                          changes.
        PRO_TK_NO_CHANGE - No layers have been changed since the last save.
        PRO_TK_BAD_INPUTS - Wrong argument. A model cannot have layers.

*/

extern ProError ProDwgLayerDisplaystatusGet( ProLayer        *layer,
                                             ProView          view,
                                             ProLayerDisplay *display_status );
/*
    Purpose: Retrieves the visibility status for the specified layer and view.

    Input Arguments:
        layer - The layer whose status you want to retrieve
        view - The view of drawing whose layer display status is requested

    Output Arguments:
        display_status - The display status

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

*/

extern ProError ProDwgLayerDisplaystatusSet( ProLayer        *layer,
                                             ProView          view,
                                             ProLayerDisplay  display_status );
/*
    Purpose: Sets the display status of the specified layer and view.

    Input Arguments:
        layer - The layer whose status you want to set
        view - The view in which you want to set the layer status
        display_status - The display status

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully set the status.
        PRO_TK_BAD_INPUTS - One or more of the input arguments are invalid
        PRO_TK_E_NOT_FOUND - The specified layer was not found.
        PRO_TK_CANT_MODIFY - display status of the layer cannot be changed

*/

extern ProError ProLayerViewDependencySet( ProView          view,
                                           ProBoolean       depend );
/*
    Purpose: Sets the display status of the view to either follow the display 
             status in the drawing, or be independent from the drawing.

    Input Arguments:
        view - The view whose display status you want to set.
        depend - If this is PRO_B_TRUE, the view display status should follow 
                 the display status in the drawing. If this is PRO_B_FALSE, the 
                 view display status should be independent from the drawing.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully set the dependency.
        PRO_TK_BAD_INPUTS - You specified an invalid view.

*/

extern ProError ProLayerViewDependencyGet( ProView          view,
					   ProBoolean      *depend );
/*
    Purpose: Returns the dependency of the view layer display from the drawing 
             layer display.

    Input Arguments:
        view - The view whose display status you want.

    Output Arguments:
        depend - If this is PRO_B_TRUE, the view display follows the drawing 
                 display. If this is PRO_B_FALSE, the view display is 
                 independent.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully returned the dependency.
        PRO_TK_BAD_INPUTS - You specified an invalid view.

*/

extern ProError ProLayerDefLayerSet( ProDefLayerType  def_layer_type,
				     ProName          def_layer_name );
/*
    Purpose: Sets up a default layer of the specified type. <b>Note:</b> This 
             function is equivalent to setting the default layer name for the 
             session using the configuration option <i>"def_layer"</i>. This 
             does not save the status to a particular model. The default layer 
             status does not remain on a layer if it is renamed.

    Input Arguments:
        def_layer_type - The type of default layer to set up.
        def_layer_name - The name of the default layer to set up. If this is an 
                         empty name, the function unsets the default layer.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully set up the default layer.
        PRO_TK_INVALID_NAME - def_layer_name contains invalid characters.
        PRO_TK_BAD_INPUTS - def_layer_type is invalid.

*/

extern ProError ProLayerDefLayerGet( ProDefLayerType  def_layer_type,
				     ProName          def_layer_name );
/*
    Purpose: Retrieves the name of the default layer of the specified type.

    Input Arguments:
        def_layer_type - The type of default layer.

    Output Arguments:
        def_layer_name - The name of the default layer. This argument is empty 
                         if a default layer is not set.

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

*/

extern ProError ProLayeritemStatusGet( ProLayerItem  *pro_layer_item,
				       ProView        pro_view, 
				       ProBoolean    *p_item_visible );
/*
    Purpose: Returns the visibility status for the specified item.

    Input Arguments:
        pro_layer_item - The layer item which visibility is evaluated.
        pro_view - The drawing view in which visibility of the item is 
                   evaluated. NULL in 3d modes.

    Output Arguments:
        p_item_visible - Visibility status of the item.

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

*/

extern ProError ProLayeritemLayerStatusGet( ProDrawing          pro_drawing,
                                            ProLayerItem       *pro_layer_item,
                                            ProLayer           *pro_layer,
                                            ProLayerItemStatus *pro_layitem_status );
/*
    Purpose: Return the item status at the layer.

    Input Arguments:
        pro_drawing - The drawing that owns the layers where the item resides. 
                      If NULL, layers residing in the same model as the given 
                      layer item will be found.
        pro_layer_item - The layer item. If the type is PRO_LAYITEM_FROM_PATH, 
                         you must supply the pro_drawing argument.
        pro_layer - The layer which contain the item.

    Output Arguments:
        pro_layitem_status - The item status.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the information.
        PRO_TK_E_NOT_FOUND - The item is not found on the layer.
        PRO_TK_BAD_INPUTS - The input arguments are invalid.

*/

extern ProError ProLayeritemLayersGet( ProDrawing     pro_drawing,
				       ProLayerItem  *pro_layer_item,
				       ProLayer     **pro_layers );
/*
    Purpose: Finds all layers containing the given item.

    Input Arguments:
        pro_drawing - The drawing that owns the layers where the item resides. 
                      If NULL, layers residing in the same model as the given 
                      layer item will be found.
        pro_layer_item - The layer item. If the type is PRO_LAYITEM_FROM_PATH, 
                         you must supply the pro_drawing argument.

    Output Arguments:
        pro_layers - ProArray of layers which contain the item. Free this array 
                     using ProArrayFree().

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the information.
        PRO_TK_E_NOT_FOUND - The item is not found on any layers in the 
                             designated model.
        PRO_TK_BAD_INPUTS - The input argument is invalid.

*/

extern ProError ProModelitemIsHidden ( ProModelitem  *item, 
                                       ProBoolean    *is_hidden);
/*
    Purpose: Identifies if the item is hidden via the "Hide" menu choice in 
             Creo Parametric or the related function ProModelitemHide().

    Input Arguments:
        item - The item.

    Output Arguments:
        is_hidden - PRO_B_TRUE if the item is hidden, PRO_B_FALSE otherwise.

    Return Values:
        PRO_TK_NO_ERROR - The function succeeded.
        PRO_TK_BAD_INPUTS - One or more input arguments was invalid.
        PRO_TK_INVALID_TYPE - The item is not permitted to be shown or hidden.

*/

extern ProError ProModelitemHide (ProModelitem* item);
/*
    Purpose: Hides the item, similar to the Creo Parametric menu choice "Hide".

    Input Arguments:
        item - The layer item.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function succeeded.
        PRO_TK_BAD_INPUTS - One or more input arguments was invalid.
        PRO_TK_NO_CHANGE - The item was already hidden.
        PRO_TK_INVALID_TYPE - The item is not permitted to be hidden.
        PRO_TK_GENERAL_ERROR - A general error occurred and the function 
                               failed.

*/

extern ProError ProModelitemUnhide (ProModelitem* item);
/*
    Purpose: Unhides the item, similar to the Creo Parametric menu choice 
             "Unhide".

    Input Arguments:
        item - The layer item.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function succeeded.
        PRO_TK_BAD_INPUTS - One or more input arguments was invalid.
        PRO_TK_NO_CHANGE - The item was already shown.
        PRO_TK_INVALID_TYPE - The item is not permitted to be shown or hidden.
        PRO_TK_GENERAL_ERROR - A general error occurred and the function 
                               failed.

*/

extern ProError ProMdlLayersCollect (ProMdl mdl, ProLayer** p_layers_array);
/*
    Purpose: Collects an array containing the layers in this model.

    Input Arguments:
        mdl - The model.

    Output Arguments:
        p_layers_array - ProArray of collected layers. Free this using 
                         ProArrayFree().

    Return Values:
        PRO_TK_NO_ERROR - The function succeeded.
        PRO_TK_BAD_INPUTS - One or more input arguments was invalid.
        PRO_TK_E_NOT_FOUND - No layers were found and collected.

*/

extern ProError ProLayerItemsPopulate ( ProLayer      *layer,
                                        ProLayerItem **p_layeritem,
                                        int*           p_count);
/*
    Purpose: Retrieves the items on the specified layer.

    Input Arguments:
        layer - The name of the layer.

    Output Arguments:
        p_layeritem - An array that contains the types and identifiers of the 
                      items on the layer. The function allocates the memory for 
                      this argument. Use ProLayeritemarrayFree() to free the 
                      allocated memory.
        p_count - The number of items on the specified layer.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the information.
        PRO_TK_BAD_INPUTS - The input argument is invalid.
        PRO_TK_E_NOT_FOUND - A layer with the specified name was not found.
        PRO_TK_GENERAL_ERROR - A general error occurred and the function 
                               failed.
        PRO_TK_OUT_OF_MEMORY - The layer has too many items to report. 
                               p_layer_item return NULL and p_count return 0.

*/

extern ProError ProLayeritemarrayFree (ProLayerItem **array);
/*
    Purpose: Frees an array of ProLayerItem returned from 
             ProLayerItemsPopulate().

    Input Arguments:
        array - The address of the array to be freed

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully freed the array.

*/

extern ProError ProLayerRuleExecute(ProMdl CurrentModel);
/*
    Purpose: Execute the layer rules on the CurrentModel if rules are enabled.

    Input Arguments:
        CurrentModel - The model upon which the layer rules will be executed.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully excuted the rules.
        PRO_TK_BAD_INPUTS - CurrentModel is NULL.
        PRO_TK_INVALID_PTR - CurrentModel is not a handle to a model.
        PRO_TK_GENERAL_ERROR - Execution of all the rules failed.

*/

extern ProError ProLayerRuleCopy(ProMdl CurrentModel, ProName LayerName, ProMdl ReferenceModel);
/*
    Purpose: Copy the rules of a layer LayerName in ReferenceModel into a layer 
             LayerName in CurrentModel, overwriting any rules 
             <p><b>Note: </b>This function copies both the rules definitions 
             and the rules options set interactively (including option 
             "Associative")

    Input Arguments:
        CurrentModel - The model into which the layer rule will be copied.
        LayerName - The name of an existing layer in both models.
        ReferenceModel - The model from which the layer rules will be copied.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully copied the rules.
        PRO_TK_BAD_INPUTS - CurrentModel or ReferenceModel is NULL.
        PRO_TK_INVALID_PTR - CurrentModel or ReferenceModel is not a handle to 
                             a model.
        PRO_TK_NOT_EXIST - Layer LayerName does not exist in one or both 
                           models.

*/

extern ProError ProLayerRuleMatch(ProMdl CurrentModel, ProName LayerName,
                                  ProMdl ReferenceModel, ProBoolean* p_match);
/*
    Purpose: Compare the rules of a layer LayerName in ReferenceModel to the 
             rules in layer LayerName in CurrentModel.

    Input Arguments:
        CurrentModel - The current model for comparison.
        LayerName - The name of an existing layer in both models.
        ReferenceModel - The reference model for comparison.

    Output Arguments:
        p_match - The result of the comparison. PRO_B_TRUE if a match, 
                  otherwise PRO_B_FALSE. Must not be NULL.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully compared the rules.
        PRO_TK_BAD_INPUTS - CurrentModel, ReferenceModel or p_match is NULL.
        PRO_TK_INVALID_PTR - CurrentModel or ReferenceModel is not a handle to 
                             a model.
        PRO_TK_NOT_EXIST - Layer LayerName does not exist in one or both 
                           models.

*/

PRO_END_C_DECLS

#endif   /* PROLAYER_H */