/*
Copyright (c) 2024 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved.
*/
#include <ProToolkitErrors.h>
#include <ProSelection.h>
#include <ProElement.h>
#include <ProMfg.h>
#include <ProMfgOptions.h>
#include <ProUtil.h>
#include <ProTKRunTime.h>
#include <TestError.h>
#include <UtilString.h>
#include <TestConsts.h>
#include <UgMfg.h>
/*====================================================================*\
FUNCTION : UserMfgParamSet
PURPOSE : Set mfg parameter element
\*====================================================================*/
ProError UserMfgParamSet(
/*--------------------------------------------------------------------*/
char *param_name,
ProValueDataType data_type,
ProValueData *in_value_data,
ProMfgParamAttr param_attr,
ProElement param_elem
)
/*--------------------------------------------------------------------*/
{
ProError err = PRO_TK_NO_ERROR;
ProElement element;
ProValueData value_data;
ProValue value;
int ii = 0, table_size = 0;
ProName wparam_name;
static ElemTable elem_table[] =
{
{ PRO_E_MFG_PRM_NAME, PRO_VALUE_TYPE_WSTRING },
{ PRO_E_MFG_PRM_ATTR, PRO_VALUE_TYPE_INT },
{ PRO_E_MFG_PRM_VAL_DBL, PRO_VALUE_TYPE_DOUBLE },
{ PRO_E_MFG_PRM_VAL_STR, PRO_VALUE_TYPE_WSTRING }
};
table_size = sizeof( elem_table ) / sizeof( ElemTable );
if ( data_type != PRO_VALUE_TYPE_DOUBLE &&
data_type != PRO_VALUE_TYPE_WSTRING )
{
return ( PRO_TK_BAD_INPUTS );
}
for ( ii = 0; ii < table_size; ii++ )
{
err = ProElementAlloc( elem_table[ii].elem_type, &element );
ERROR_CHECK( "UserMfgParamSet","ProElementAlloc()", err );
switch ( elem_table[ii].elem_type )
{
case PRO_E_MFG_PRM_NAME:
ProStringToWstring( wparam_name, param_name );
err = ProElementWstringSet(element, wparam_name);
ERROR_CHECK( "UserMfgParamSet", "ProElementWstringSet()", err );
break;
case PRO_E_MFG_PRM_ATTR:
err = ProElementIntegerSet (element, param_attr);
ERROR_CHECK( "UserWorkcellCreate","ProElementIntegerSet()", err );
break;
case PRO_E_MFG_PRM_VAL_DBL:
if ( data_type == PRO_VALUE_TYPE_DOUBLE )
{
err = ProElementDoubleSet (element, in_value_data->v.d);
ERROR_CHECK( "UserWorkcellCreate","ProElementDoubleSet()", err );
}
else
{
err = ProElementDoubleSet (element, (double) 0.0);
ERROR_CHECK( "UserWorkcellCreate","ProElementDoubleSet()", err );
}
break;
case PRO_E_MFG_PRM_VAL_STR:
if ( data_type == PRO_VALUE_TYPE_WSTRING )
{
if ( in_value_data->v.w != NULL )
{
err = ProElementWstringSet(element, in_value_data->v.w);
ERROR_CHECK( "UserMfgParamSet", "ProElementWstringSet()", err );
}
}
break;
default:
ProTKFprintf( stderr, "Error setting element type\n" );
err = PRO_TK_GENERAL_ERROR;
ERROR_CHECK( "UserMfgParamSet","UserMfgParamSet()", err );
break;
}
err = ProElemtreeElementAdd( param_elem, NULL, element );
ERROR_CHECK( "UserMfgParamSet","ProElemtreeElementAdd", err );
}
return ( err );
}
/*====================================================================*\
FUNCTION : UserMfgParamArrSet
PURPOSE : Set parameter array element
\*====================================================================*/
ProError UserMfgParamArrSet(
/*--------------------------------------------------------------------*/
MfgPrmDblValue dbl_params[],
int n_dbl_params,
MfgPrmStrValue str_params[],
int n_str_params,
ProElement params_elem
)
/*--------------------------------------------------------------------*/
{
ProError err = PRO_TK_NO_ERROR;
ProElement element;
ProValueData value_data;
ProValue value;
int ii = 0;
/**********************************/
/* PARAMETERS WITH DOUBLE VALUES */
/**********************************/
for ( ii = 0; ii < n_dbl_params; ii++ )
{
err = ProElementAlloc( PRO_E_MFG_PARAM_COMPOUND, &element );
ERROR_CHECK( "UserMfgParamArrSet", "ProElementAlloc", err );
value_data.v.d = dbl_params[ii].dbl_val;
err = UserMfgParamSet( dbl_params[ii].param_name,
PRO_VALUE_TYPE_DOUBLE,
&value_data,
PRO_MFG_PRM_ATTR_MODIFIED,
element );
ERROR_CHECK( "UserMfgParamArrSet","UserMfgParamSet", err );
err = ProElemtreeElementAdd( params_elem, NULL, element );
ERROR_CHECK( "UserMfgParamArrSet","ProElemtreeElementAdd", err );
}
/**********************************/
/* PARAMETERS WITH STRING VALUES */
/**********************************/
value_data.v.w = (wchar_t*) malloc( sizeof(ProLine) );
for ( ii = 0; ii < n_str_params; ii++ )
{
err = ProElementAlloc( PRO_E_MFG_PARAM_COMPOUND, &element );
ERROR_CHECK( "UserMfgParamArrSet", "ProElementAlloc", err );
if ( value_data.v.w != NULL )
{
err = ProWstringCopy( str_params[ii].str_val, value_data.v.w,
PRO_VALUE_UNUSED );
ERROR_CHECK( "UserMfgParamArrSet","ProWstringCopy()", err );
}
err = UserMfgParamSet( str_params[ii].param_name,
PRO_VALUE_TYPE_WSTRING,
&value_data,
PRO_MFG_PRM_ATTR_MODIFIED,
element );
ERROR_CHECK( "UserMfgParamArrSet","UserMfgParamSet", err );
err = ProElemtreeElementAdd( params_elem, NULL, element );
ERROR_CHECK( "UserMfgParamArrSet","ProElemtreeElementAdd", err );
}
free( value_data.v.w );
return ( err );
}
/*====================================================================*\
FUNCTION : UserToolCompoundSet
PURPOSE : Set tool reference element
\*====================================================================*/
ProError UserToolCompoundSet(
/*--------------------------------------------------------------------*/
int head_number,
int pocket_number,
wchar_t *tool_name,
ProElement tool_ref_elem
)
/*--------------------------------------------------------------------*/
{
ProError err = PRO_TK_NO_ERROR;
ProElement element;
ProValueData value_data;
ProValue value;
int ii = 0, table_size = 0;
static ElemTable elem_table[] =
{
{ PRO_E_MFG_TOOL_REF_HEAD_NUM, PRO_VALUE_TYPE_INT },
{ PRO_E_MFG_TOOL_REF_POCKET, PRO_VALUE_TYPE_INT },
{ PRO_E_MFG_TOOL_REF_ID, PRO_VALUE_TYPE_WSTRING }
};
table_size = sizeof( elem_table ) / sizeof( ElemTable );
for ( ii = 0; ii < table_size; ii++ )
{
err = ProElementAlloc( elem_table[ii].elem_type, &element );
ERROR_CHECK( "UserToolCompoundSet","ProElementAlloc()", err );
switch ( elem_table[ii].elem_type )
{
case PRO_E_MFG_TOOL_REF_HEAD_NUM:
err = ProElementIntegerSet(element, head_number);
ERROR_CHECK( "UserToolCompoundSet", "ProElementIntegerSet()", err );
break;
case PRO_E_MFG_TOOL_REF_POCKET:
err = ProElementIntegerSet(element, pocket_number);
ERROR_CHECK( "UserToolCompoundSet", "ProElementIntegerSet()", err );
break;
case PRO_E_MFG_TOOL_REF_ID:
err = ProElementWstringSet(element, tool_name);
ERROR_CHECK( "UserToolCompoundSet", "ProElementWstringSet()", err );
break;
default:
ProTKFprintf( stderr, "Error setting element type\n" );
err = PRO_TK_GENERAL_ERROR;
ERROR_CHECK( "UserToolCompoundSet","UserToolCompoundSet()", err );
break;
}
err = ProElemtreeElementAdd( tool_ref_elem, NULL, element );
ERROR_CHECK( "UserToolCompoundSet","ProElemtreeElementAdd", err );
}
return ( err );
}
/*====================================================================*\
FUNCTION : UserPlaneRetractSet
PURPOSE : Set retract element for plane retract
\*====================================================================*/
ProError UserPlaneRetractSet(
/*--------------------------------------------------------------------*/
ProSelection retract_plane,
ProElement retract_elem
)
/*--------------------------------------------------------------------*/
{
ProError err = PRO_TK_NO_ERROR;
ProElement element;
ProValueData value_data;
ProValue value;
ProSelection selection;
ProReference reference;
int ii = 0, table_size = 0;
static ElemTable retract_elem_table[] =
{
{ PRO_E_RETR_SURF_TYPE, PRO_VALUE_TYPE_INT },
{ PRO_E_RETR_SURF_REF, PRO_VALUE_TYPE_SELECTION }
};
table_size = sizeof( retract_elem_table ) / sizeof( ElemTable );
for ( ii = 0; ii < table_size; ii++ )
{
err = ProElementAlloc( retract_elem_table[ii].elem_type, &element );
ERROR_CHECK( "UserPlaneRetractSet","ProElementAlloc()", err );
switch ( retract_elem_table[ii].elem_type )
{
case PRO_E_RETR_SURF_TYPE:
break;
case PRO_E_RETR_SURF_REF:
selection = retract_plane;
break;
default:
ProTKFprintf( stderr, "Error setting element type\n" );
err = PRO_TK_GENERAL_ERROR;
ERROR_CHECK( "UserPlaneRetractSet","UserPlaneRetractSet()", err );
break;
}
if ( retract_elem_table[ii].val_type != PRO_VALUE_TYPE_SELECTION )
{
err = ProElementIntegerSet(element,PRO_RETR_SURF_PLANE);
ERROR_CHECK( "UserPlaneRetractSet", "ProElementIntegerSet()", err );
}
else if ( retract_elem_table[ii].val_type == PRO_VALUE_TYPE_SELECTION )
{
err = ProSelectionToReference( selection, &reference );
ERROR_CHECK( "UserPlaneRetractSet()", "ProSelectionToReference", err );
err = ProElementReferenceSet( element, reference );
ERROR_CHECK( "UserPlaneRetractSet()", "ProElementReferenceSet", err );
}
err = ProElemtreeElementAdd( retract_elem, NULL, element );
ERROR_CHECK( "UserPlaneRetractSet","ProElemtreeElementAdd", err );
}
return ( err );
}
/*====================================================================*\
Function : UserNcSeqTreeCommonElementsAdd
Purpose : Add commont nc sequence elements to element tree
- feature type;
- sequence type;
- feature name;
- sequence type;
- operation reference;
- csys reference;
- tool reference;
- mfg parameters;
\*====================================================================*/
ProError UserNcSeqTreeCommonElementsAdd (
/*--------------------------------------------------------------------*/
ProMfg mfg_model,
int feat_type,
ProNcseqType ncseq_type,
ProName feat_name,
ProSelection operation,
ProSelection retract_plane, /* can be NULL for turning sequences */
ProSelection seq_csys,
ProMfgToolHeadType head_num,
int pocket_num,
wchar_t *tool_name,
MfgPrmDblValue dbl_params[],
int n_dbl_params,
MfgPrmStrValue str_params[],
int n_str_params,
ProElement elem_tree
)
/*--------------------------------------------------------------------*/
{
ProError err = PRO_TK_NO_ERROR;
ProElement element;
ProValueData value_data;
ProValue value = NULL;
ProSelection selection;
ProReference reference = NULL;
int ii = 0, size = 0;
static ElemTable common_elements[] =
{
{ PRO_E_FEATURE_TYPE, PRO_VALUE_TYPE_INT },
{ PRO_E_STD_FEATURE_NAME, PRO_VALUE_TYPE_WSTRING },
{ PRO_E_NCSEQ_TYPE, PRO_VALUE_TYPE_INT },
{ PRO_E_MFG_OPER_REF, PRO_VALUE_TYPE_SELECTION },
{ PRO_E_NCSEQ_CSYS, PRO_VALUE_TYPE_SELECTION },
{ PRO_E_RETR_SURF, COMPOUND },
{ PRO_E_MFG_TOOL_REF_COMPOUND, COMPOUND },
{ PRO_E_MFG_PARAM_ARR, ARRAY }
};
size = sizeof( common_elements ) / sizeof( ElemTable );
for ( ii = 0 ; ii < size; ii++ )
{
err = ProElementAlloc( common_elements[ii].elem_type, &element );
ERROR_CHECK( "UserNcSeqTreeCommonElementsAdd","ProElementAlloc()", err );
switch ( common_elements[ii].elem_type )
{
case PRO_E_FEATURE_TYPE :
err = ProElementIntegerSet( element, feat_type );
ERROR_CHECK( "UserNcSeqTreeCommonElementsAdd()",
"ProElementIntegerSet", err );
break;
case PRO_E_STD_FEATURE_NAME:
err = ProElementWstringSet( element, feat_name );
ERROR_CHECK( "UserNcSeqTreeCommonElementsAdd()",
"ProElementWstringSet", err );
break;
case PRO_E_NCSEQ_TYPE :
err = ProElementIntegerSet( element, ncseq_type );
ERROR_CHECK( "UserNcSeqTreeCommonElementsAdd()",
"ProElementIntegerSet", err );
break;
case PRO_E_MFG_OPER_REF :
selection = operation;
break;
case PRO_E_NCSEQ_CSYS:
selection = seq_csys;
break;
case PRO_E_RETR_SURF :
if ( retract_plane == NULL ) /* allowed for turning sequences */
{
err = ProElementFree( &element );
continue;
}
else
{
err = UserPlaneRetractSet( retract_plane, element );
ERROR_CHECK( "UserNcSeqTreeCommonElementsAdd",
"UserPlaneRetractSet()", err );
}
break;
case PRO_E_MFG_TOOL_REF_COMPOUND:
if ( tool_name == NULL ) /* allowed for manual cycle sequence */
{
err = ProElementFree( &element );
continue;
}
else
{
err = UserToolCompoundSet( head_num, pocket_num, tool_name,
element );
ERROR_CHECK( "UserNcSeqTreeCommonElementsAdd",
"UserToolCompoundSet()", err );
}
break;
case PRO_E_MFG_PARAM_ARR:
err = UserMfgParamArrSet( dbl_params, n_dbl_params,
str_params, n_str_params,
element );
ERROR_CHECK( "UserNcSeqTreeCommonElementsAdd", "UserMfgParamArrSet()",
err );
break;
default:
ProTKFprintf( stderr, "Error setting element type\n" );
err = PRO_TK_GENERAL_ERROR;
ERROR_CHECK( "UserNcSeqTreeCommonElementsAdd",
"UserNcSeqTreeCommonElementsAdd()", err );
break;
}
if ( common_elements[ii].val_type == PRO_VALUE_TYPE_SELECTION )
{
err = ProSelectionToReference( selection, &reference );
ERROR_CHECK( "UserNcSeqTreeCommonElementsAdd()",
"ProSelectionToReference", err );
err = ProElementReferenceSet( element, reference );
ERROR_CHECK( "UserNcSeqTreeCommonElementsAdd()",
"ProElementReferenceSet", err );
}
/*--------------------------------------------------------------------*\
Add the element to elem tree
\*--------------------------------------------------------------------*/
err = ProElemtreeElementAdd( elem_tree, NULL, element );
ERROR_CHECK( "UserNcSeqTreeCommonElementsAdd", "ProElemtreeElementAdd()",
err );
}
return ( (int)err );
}