#ifndef PRO_KIN_DRAG_H
#define PRO_KIN_DRAG_H



#include <ProToolkit.h>
#include <ProANSI.h>
#include <ProObjects.h>
#include <ProSelection.h>

PRO_BEGIN_C_DECLS

typedef enum proKinDragType
{
  PRO_KIN_POINT_DRAG,
  PRO_KIN_BODY_DRAG,
  PRO_KIN_ADVANCED_TRANS_X,
  PRO_KIN_ADVANCED_TRANS_Y,
  PRO_KIN_ADVANCED_TRANS_Z,
  PRO_KIN_ADVANCED_ROT_X,
  PRO_KIN_ADVANCED_ROT_Y,
  PRO_KIN_ADVANCED_ROT_Z
} ProKinDragType;

extern ProError ProKinDragStart (void);
/*
    Purpose: this function starts a drag session it should be called before any 
             other Kinematic drag or Snapshot function is called. All 
             subsequent functions will work with the Snapshots of the window 
             assembly. All ProAsmcomppath should start from this assembly. All 
             transforms belong to this assembly. The function can be called for 
             design assemblies in Standard Assembly and Mechanism modes. It 
             cannot be used if assembly is exploded, if sketcher is active, 
             when component placement is active or when drag dialog is on 
             screen.

    Input Arguments:
        none

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function was successful.
        PRO_TK_CHECKOUT_CONFLICT - The function was successful, but some of 
                                   models are read only and can not be dragged.
        PRO_TK_GENERAL_ERROR - The function cannot be called at this moment. 
                               For example, kin drag is not available in the 
                               current mode, some component is activated 
                               instead of top assembly, some dialog is active 
                               on screen.

*/

extern ProError ProKinDragStop (void);
/*
    Purpose: this function will stop drag session. Function ProWindowRefresh() 
             should be performed to see the change of the graphic window scale 
             according to updated outline.

    Input Arguments:
        none

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function was successful.
        PRO_TK_GENERAL_ERROR - The function ProKinDragStart was not called 
                               before.

*/

extern ProError ProKinDragSessionInquire (void);
/*
    Purpose: this function checks if drag session is on. The drag session may 
             exist automatically in some cases: redefine, regeneration, window 
             switch, representation mode chage etc.

    Input Arguments:
        none

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The drag session is active.
        PRO_TK_GENERAL_ERROR - The drag session is closed.

*/

extern ProError ProKinDragSnapshotsNamesGet (ProName **snap_names, 
       ProAsmcomppath **path_arr);
/*
    Purpose: this function will bring all snapshots belonging to the window 
             assembly and its subassemblies.

    Input Arguments:
        none

    Output Arguments:
        snap_names - The array of snapshot names. The function allocates the 
                     memory for this argument. To free the memory, call 
                     ProArrayFree().
        path_arr - The array of ProAsmcomppath. The function allocates the 
                   memory for this argument. To free the memory, call 
                   ProArrayFree().

    Return Values:
        PRO_TK_NO_ERROR - The function was successful.
        PRO_TK_GENERAL_ERROR - The function ProKinDragStart has not been called 
                               before.

*/

extern ProError ProKinDragEnvironmentSet (const ProName snap_name,
       const ProAsmcomppath *path, const ProKinDragType type, 
       const ProSelection refobject);
/*
    Purpose: this function setups the environment for subsequenmt dragging and 
             reconnect operations. Environment can be set / reset several times 
             after ProKinDragStart() is called.

    Input Arguments:
        snap_name - name of the existing snapshot which constraints will be 
                    active during drag. NULL can be passed instead. The 
                    snapshot will be checked for status (good / outdated 
                    /incomplete);
        path - ProAsmcomppath of snapshot. NULL can be passed for top level 
               snapshots.
        type - type of the drag to be performed.
        refobject - a selection represented coordinate system (PRO_CSYS), part 
                    (PRO_PART) or body (PRO_MDO_BODY) for advanced drag. It is 
                    relevant for advanced drag types only. For all other drag 
                    types it is ignored, NULL should be passed instead. In part 
                    selection case takes coordinates of corresponded body.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function was successful.
        PRO_TK_OUTDATED - The environment has been set, but the snapshot is 
                          outdated.
        PRO_TK_INCOMPLETE - The environment has been set, but the snapshot is 
                            incomplete.
        PRO_TK_CHECK_OMITTED - The environment has been set, but the snapshot 
                               validity check has not been performed, because 
                               outdated or incomplete snapshot has earlier been 
                               applied.
        PRO_TK_BAD_INPUTS - One of the input parameters is bogus.
        PRO_TK_GENERAL_ERROR - The function ProKinDragStart has not been called 
                               before.

*/

extern ProError ProKinDragPerformMove (const ProSelection dragpoint, 
       const Pro2dPnt *screenx_y);
/*
    Purpose: this function bring to drag this selected object. Displays a hook 
             point around the point. Performs a drag according to the 
             environment set in ProKinDragEnvironmentSet(). For dragging use 
             constraints from current snapshot, if it set. After end of the 
             movement the hook point is removed.

    Input Arguments:
        dragpoint - A geometrical object (PRO_POINT, PRO_SURFACE_PNT, PRO_AXIS, 
                    PRO_EDGE, PRO_CURVE, PRO_DATUM_PLANE, PRO_SRF_PLANE_PNT, 
                    PRO_SURFACE for PRO_KIN_POINT_DRAG, or PRO_PART, 
                    PRO_MDO_BODY for all other drag types) to be dragged. Set 
                    the selected-point using ProSelectionPoint3dSet(), 
                    otherwise the hook point will be wrong and movement result 
                    will be wrong as well.
        screenx_y - ProArray array of Pro2dPnt X and Y screen coordinates we 
                    want our dragpoint to be moved to.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function was successful.
        PRO_TK_BAD_INPUTS - Dragpoint cannot be used for dragging. For example, 
                            it may belong to Ground or undefined body.
        PRO_TK_NOT_VALID - Connect failed. The model is left unchanged.
        PRO_TK_GENERAL_ERROR - The function ProKinDragStart has not been called 
                               before.

*/

extern ProError ProKinDragReconnect (void);
/*
    Purpose: reconnect is performed taking into account constraints (but not 
             transforms) from the snapshot specified in 
             ProKinDragEnvironmentSet(). Function ProWindowRefresh() should be 
             performed to see the changes in components positions.

    Input Arguments:
        none

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function was successful.
        PRO_TK_NOT_VALID - Connect failed. The model is left unchanged.
        PRO_TK_GENERAL_ERROR - The function ProKinDragStart has not been called 
                               before.

*/

extern ProError ProSnapshotApply (void);
/*
    Purpose: applies the transforms of the active snapshot. Unlike UI, no 
             attempt to reconnect is performed here. User should call 
             ProKinDragReconnect() if reconnect is necessary. Function 
             ProWindowRefresh() should be performed to see the changes in 
             components positions.

    Input Arguments:
        none

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function was successful.
        PRO_TK_OUTDATED - The snapshot has been applied despite it is outdated. 
                          All subsequent snapshot validity checks will be 
                          omitted till next assembly regeneration (see also 
                          return code PRO_TK_CHECK_OMITTED of 
                          ProKinDragEnvironmentSet().
        PRO_TK_INCOMPLETE - The snapshot has been applied despite it is 
                            incomplete. All subsequent snapshot validity checks 
                            will be omitted till next assembly regeneration 
                            (see also return code PRO_TK_CHECK_OMITTED of 
                            ProKinDragEnvironmentSet().
        PRO_TK_GENERAL_ERROR - No current snapshot is set.

*/

extern ProError ProSnapshotCreate (const ProName snap_name);
/*
    Purpose: creates a top assembly level snapshot from the current position on 
             screen. Constraints will be copied from the active snapshot. The 
             newly created snapshot will become the active one.

    Input Arguments:
        snap_name - Name of the snapshot to be created.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function was successful.
        PRO_TK_INVALID_NAME - The name specified is invalid or already used.
        PRO_TK_INVALID_ITEM - Some of constraints could not be copied from the 
                              active snapshot.
        PRO_TK_GENERAL_ERROR - The function failed.

*/

extern ProError ProSnapshotUpdate (const ProName snap_name);
/*
    Purpose: updates components transformation matrices in a snapshot from the 
             current position on screen. Constraints will be copied from the 
             active snapshot. The newly updated snapshot will become the active 
             one. Available for top level snapshot only.

    Input Arguments:
        snap_name - Name of the snapshot to be updated.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function was successful.
        PRO_TK_E_NOT_FOUND - The snapshot with specified name is not found.
        PRO_TK_GENERAL_ERROR - The function failed.

*/

extern ProError ProSnapshotRename (const ProName new_snap_name);
/*
    Purpose: renames the active snapshot. Available for top level snapshot 
             only.

    Input Arguments:
        new_snap_name - The new name of the snapshot.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function was successful.
        PRO_TK_INVALID_NAME - The name specified is invalid or already used.
        PRO_TK_GENERAL_ERROR - The function failed.

*/

extern ProError ProSnapshotDelete (const ProName snap_name,
       const ProAsmcomppath *path);
/*
    Purpose: delete a snapshot.

    Input Arguments:
        snap_name - Name of the snapshot to be deleted.
        path - ProAsmcomppath of snapshot. NULL can be passed for top level.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function was successful.
        PRO_TK_E_NOT_FOUND - The snapshot with specified name is not found.
        PRO_TK_GENERAL_ERROR - The function failed.

*/

extern ProError ProSnapshotTrfsGet (const ProName snap_name,
       const ProAsmcomppath *path, ProAsmcomppath **path_arr, 
       ProMatrix **trf_arr);
/*
    Purpose: brings transformation paths and transformation matrices for all 
             components in the snapshot versus top level assembly.

    Input Arguments:
        snap_name - Name of the snapshot.
        path - ProAsmcomppath of snapshot. NULL can be passed for top level 
               snapshot.

    Output Arguments:
        path_arr - The array of ProAsmcomppath calculated from top assembly. 
                   The function allocates the memory for this argument. To free 
                   the memory, call ProArrayFree().
        trf_arr - The array of transformation matrices showing transformation 
                  from specified component to the top level assembly. The 
                  function allocates the memory for this argument. To free the 
                  memory, call ProArrayFree().

    Return Values:
        PRO_TK_NO_ERROR - The function was successful.
        PRO_TK_E_NOT_FOUND - The snapshot with specified name is not found.
        PRO_TK_GENERAL_ERROR - The function failed.

*/


extern ProError ProSnapshotTrfsUpdate (const ProName snap_name,
       const ProAsmcomppath *path_arr, const ProMatrix *trf_arr);
/*
    Purpose: updates transformation matrices for several components in the 
             snapshot. Display is left unchanged. Available for top level 
             snapshot only.

    Input Arguments:
        snap_name - Name of the snapshot to be updated.
        path_arr - The array of ProAsmcomppath.
        trf_arr - The array of transformation matrices for these paths.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function was successful.
        PRO_TK_E_NOT_FOUND - The snapshot with specified name is not found.
        PRO_TK_GENERAL_ERROR - The function failed.

*/

extern ProError ProSnapshotAllowedInDrawingSet (const ProBool allow);
/*
    Purpose: makes active snapshot available / unavailable in drawings. 
             Available for top level snapshot only.

    Input Arguments:
        allow - Make available if allow is PRO_B_TRUE and unavailable 
                otherwise.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function was successful.
        PRO_TK_GENERAL_ERROR - The function failed.

*/

extern ProError ProSnapshotAllowedInDrawingGet (ProBool *p_is_allowed);
/*
    Purpose: finds if the active snapshot is allowed in drawing or not.

    Input Arguments:
        none

    Output Arguments:
        p_is_allowed - PRO_B_TRUE if snapshot is allowed in drawing or 
                       PRO_B_FALSE otherwise.

    Return Values:
        PRO_TK_NO_ERROR - The function was successful.
        PRO_TK_GENERAL_ERROR - The function failed.

*/

typedef enum proSnapshotConstraintType
{
  PRO_SNAP_UNSUPPORTED = -1,
  /* Standard constraints types supported in Drag dialog UI. */
  PRO_SNAP_ALIGN,                  
  PRO_SNAP_MATE,                        
  PRO_SNAP_ORIENT,
  PRO_SNAP_MOTION_AXIS_POS,
  PRO_SNAP_BODY_LOCK,        
  PRO_SNAP_CONNECTION_DISABLE, 
  PRO_SNAP_PARALLEL_VIEW_PLANE, /* Constraints of this type is temporary, and
                                   live only during current drag API session.*/
                                   
  PRO_SNAP_CAM_LIFTOFF_ENABLE,
  PRO_SNAP_CAM_LIFTOFF_DISABLE
} ProSnapshotConstraintType;

/*
  Permitted selections types corresponding to ProSnapshotConstraintType
  
  PRO_SNAP_ALIGN     - PRO_POINT, PRO_SURFACE_PNT, PRO_AXIS, PRO_EDGE, 
                       PRO_CURVE, PRO_DATUM_PLANE, PRO_SRF_PLANE_PNT, 
                       PRO_SURFACE.
  PRO_SNAP_MATE,   
  PRO_SNAP_ORIENT    - PRO_DATUM_PLANE, PRO_SRF_PLANE_PNT, PRO_SURFACE.
  PRO_SNAP_MOTION_AXIS_POS
                     - PRO_MDO_CONN_AXIS_ROT_1/2/3, PRO_MDO_CONN_AXIS_TR_1/2/3,
                       PRO_MDO_SLOT_AXIS.
  PRO_SNAP_BODY_LOCK - PRO_PART, PRO_MDO_BODY.
  PRO_SNAP_CONNECTION_DISABLE
                     - PRO_MDO_CONN, PRO_MDO_CAM_CONN, PRO_MDO_SLOT_CONN, 
                       PRO_MDO_GEAR_CONN.
  PRO_SNAP_PARALLEL_VIEW_PLANE
                     - PRO_POINT, PRO_SURFACE_PNT, PRO_EDGE_START, PRO_EDGE_END,
                       PRO_CRV_START, PRO_CRV_END, PRO_AXIS, PRO_EDGE, 
                       PRO_CURVE, PRO_SRF_PLANE_PNT, PRO_SURFACE, 
                       PRO_DATUM_PLANE.
                       (All types of the selections will be interpreted as a 
                        point. In line and surface cases, the point is 
                        evaluated using the UV parameters.)
  PRO_SNAP_CAM_LIFTOFF_ENABLE/_DISABLE 
                     - PRO_MDO_CAM_CONN.
*/

typedef struct proSnapshotConstraint
{
  ProSnapshotConstraintType   type;
  ProSelection               *sel_array;  /* ProArray of selections.
    Number of selection depends on the constraint type. 1 selection is needed
    for PRO_SNAP_MOTION_AXIS_POS, PRO_SNAP_CONNECTION_DISABLE, 
    PRO_SNAP_PARALLEL_VIEW_PLANE, PRO_SNAP_CAM_LIFTOFF_ENABLE/DISABLE; 
    2 selections are needed for PRO_SNAP_ALIGN, PRO_SNAP_MATE, PRO_SNAP_ORIENT,
    2 or more selections can be used for PRO_SNAP_BODY_LOCK. */
  double                      value;      /* Meaningful for 
    PRO_SNAP_MOTION_AXIS_POS, and also for plane references used in 
    PRO_SNAP_ALIGN, PRO_SNAP_MATE, PRO_SNAP_ORIENT. */
  ProBool                     user_active; /* Turns constraint on or off. */
  ProBool                     valid;       /* The values are 
    PRO_B_TRUE  - the constraint is valid (active), 
    PRO_B_FALSE - the constraint is invalid (supressed) */
} ProSnapshotConstraint;

extern ProError ProSnapshotConstraintsGet (const ProName snap_name,
       const ProAsmcomppath *path, ProSnapshotConstraint **constraints);
/*
    Purpose: brings all constraints from a snapshot.

    Input Arguments:
        snap_name - Name of the snapshot.
        path - ProAsmcomppath of snapshot. NULL can be passed for top level.

    Output Arguments:
        constraints - The array of snapshot constraints. The function allocates 
                      the memory for this argument. To free the memory, call 
                      ProSelectionarrayFree() for sel_array in each constraint 
                      and then ProArrayFree() for the constraints.

    Return Values:
        PRO_TK_NO_ERROR - The function was successful.
        PRO_TK_E_NOT_FOUND - The snapshot with specified name is not found.
        PRO_TK_GENERAL_ERROR - The function failed.

*/

extern ProError ProSnapshotConstraintAdd (const ProName snap_name,
       const ProSnapshotConstraint *constraint);
/*
    Purpose: adds a constraint to a snapshot. Available for top level snapshot 
             only.

    Input Arguments:
        snap_name - Name of the snapshot.
        constraint - Pointer of the constraint to be added. The field 
                     constraint->valid is ignored.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function was successful.
        PRO_TK_E_NOT_FOUND - The snapshot with specified name is not found.
        PRO_TK_E_FOUND - The similar constraint exists in the snapshot.
        PRO_TK_OUT_OF_RANGE - The constraint->value is out of range.
        PRO_TK_GENERAL_ERROR - The function failed.

*/

extern ProError ProSnapshotConstraintDelete (const ProName snap_name, 
       const int ndx);
/*
    Purpose: deletes a constraint from a snapshot. Available for top level 
             snapshot only.

    Input Arguments:
        snap_name - Name of the snapshot.
        ndx - Index of the constraint from the constraints array (as brought by 
              ProSnapshotConstraintsGet() to be deleted.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function was successful.
        PRO_TK_E_NOT_FOUND - The snapshot with specified name is not found.
        PRO_TK_BAD_INPUTS - The specified index is wrong.
        PRO_TK_GENERAL_ERROR - The function failed.

*/

extern ProError ProSnapshotConstraintUpdate  (const ProName snap_name, 
       const int ndx, const ProSnapshotConstraint *constraint);
/*
    Purpose: updates a constraint in a snapshot. Available for top level 
             snapshot only.

    Input Arguments:
        snap_name - Name of the snapshot.
        ndx - Index of the constraint from the constraints array (as brought by 
              ProSnapshotConstraintsGet() to be updated.
        constraint - Pointer to the new constraint to be used instead of the 
                     old one. The field constraint->valid is ignored.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function was successful.
        PRO_TK_E_NOT_FOUND - The snapshot with specified name is not found.
        PRO_TK_BAD_INPUTS - The specified index is wrong.
        PRO_TK_E_FOUND - The similar constraint exists in the snapshot.
        PRO_TK_OUT_OF_RANGE - The constraint->value is out of range.
        PRO_TK_GENERAL_ERROR - The function failed.

*/

extern ProError 
ProSnapshotConstraintEvaluate (const ProSnapshotConstraint *constraint, 
                               double *position);
/*
    Purpose: evaluate a constraint of type PRO_SNAP_MOTION_AXIS_POS for the 
             model shown on screen. The function does not depend on the current 
             snapshot, and it is not important whether the snapshot contains 
             the constraint or not.

    Input Arguments:
        constraint - Pointer to the constraint of type PRO_SNAP_MOTION_AXIS_POS 
                     with sel_array field filled up before calling the 
                     function. The fields constraint->user_active and 
                     constraint->valid are ignored.

    Output Arguments:
        position - The current motion axis position.

    Return Values:
        PRO_TK_NO_ERROR - The function was successful.
        PRO_TK_BAD_INPUTS - The constraint is incorrect or it is not of type 
                            PRO_SNAP_MOTION_AXIS_POS.
        PRO_TK_GENERAL_ERROR - The function failed.

*/


PRO_END_C_DECLS

#endif