/*
Copyright (c) 2019 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved.
*/
#include <ProToolkit.h>
#include <ProMfg.h>
#include <ProSolid.h>
#include <ProSelection.h>
#include <ProAsmcomppath.h>
#include <ProElement.h>
#include <ProElemId.h>
#include <ProValue.h>
#include <ProFeature.h>
#include <ProUtil.h>
#include <ProTool.h>
#include <ProMfgOptions.h>
#include <ProAsmcomp.h>
#include <ProCrvcollection.h>
#include <ProFeatType.h>
#include <ProWcell.h>
#include <ProMdlUnits.h>
#include <ProSrfcollection.h>
#include <TestError.h>
#include <UtilString.h>
#include <UtilTree.h>
#include <UtilCollect.h>
#include <UtilVisit.h>
#include <TestConsts.h>
#include <PTApplsUnicodeUtils.h>
#include <ProMessage.h>
#include <ProModelitem.h>
#include <UtilMessage.h>
#include <UgMfg.h>
/***********************************************************************/
/* Sequence type Function */
/*---------------------------------------------------------------------*/
/* PRO_NCSEQ_FACE_MILL UserFacingCreate */
/* PRO_NCSEQ_TRAJ_MILL_STEP UserTrajectoryCreate */
/* PRO_NCSEQ_FF_TRAJ_MILL UserCurveTrajCreate */
/* PRO_NCSEQ_ROUGHVOL_MILL UserRoughingCreate */
/* PRO_NCSEQ_REROUGH_MILL UserReRoughingCreate */
/* PRO_NCSEQ_CVNC_FINISH_MILL UserFinishingCreate */
/* PRO_NCSEQ_PROF_SURF_MILL UserProfilingCreate */
/* PRO_NCSEQ_MANUAL_CYCLE_MILL UserManualCycleCreate */
/* PRO_NCSEQ_HOLEMAKING (PRO_HOLE_MK_CSINK) UserCSinkgCreate */
/* PRO_NCSEQ_HOLEMAKING (PRO_HOLE_MK_DRILL) UserDrillingCreate */
/***********************************************************************/
extern ProLine msg_fil17;
#define MSG_FIL ProStringToWstring(msg_fil17,"msg_ugmfg.txt")
typedef struct
{
ProMfg model;
ProSelection operation;
ProBoolean oper_found;
ProSelection retract_plane;
ProBoolean retract_found;
ProSelection face_mill_window;
ProBoolean face_mill_wind_found;
ProSelection pocket_mill_window;
ProBoolean pocket_mill_wind_found;
ProSelection traj_curve;
ProBoolean traj_curve_found;
ProSelection prof_mill_surf;
ProBoolean prof_mill_surf_found;
ProSelection csys;
ProBoolean csys_found;
} NcseqEnts ;
/*====================================================================*\
Function : UserPlaneGeomIdGet
Purpose : Get the id of the datum plane feature's geometry
\*====================================================================*/
ProError UserGeomItemGet (
/*--------------------------------------------------------------------*/
ProGeomitem *geomitem,
ProError err,
ProAppData app_data
)
/*--------------------------------------------------------------------*/
{
*(ProGeomitem*)app_data = *geomitem;
return ( PRO_TK_E_FOUND );
}
/*====================================================================*\
Function : UserNcseqEntitiesCollect
Purpose : Collect sequence references and use them to create a sequence
\*====================================================================*/
ProError UserNcseqEntitiesCollect (
/*--------------------------------------------------------------------*/
ProFeature *feature,
ProError status,
ProAppData entities
)
/*--------------------------------------------------------------------*/
{
ProError err;
ProFeattype feat_type;
ProWcellType wcell_type;
NcseqEnts *seq_ents = (NcseqEnts*)entities;
ProSelection selection;
ProGeomitem geom_item;
ProName w_name;
ProCharName name;
int id;
err = ProFeatureTypeGet( feature, &feat_type );
ERROR_CHECK( "UserNcseqEntitiesCollect", "ProFeatureTypeGet()",err );
if ( !seq_ents->oper_found && feat_type == PRO_FEAT_OPERATION )
{
err = ProSelectionAlloc( NULL, feature, &selection );
ERROR_CHECK( "UserNcseqEntitiesCollect", "ProSelectionAlloc()", err );
ProSelectionCopy( selection, &seq_ents->operation );
seq_ents->oper_found = PRO_B_TRUE;
}
else if ( !seq_ents->prof_mill_surf_found &&
feat_type == PRO_FEAT_DATUM_SURF )
{
err = ProModelitemNameGet( feature, w_name );
ERROR_CHECK( "UserNcseqEntitiesCollect", "ProModelitemNameGet()", err );
ProWstringToString( name, w_name );
if ( !strcmp( name,"PROF_MILL_SURF" ) )
{
err = ProFeatureGeomitemVisit( feature, PRO_QUILT, UserGeomItemGet,
NULL, (ProAppData)&geom_item );
ERROR_CHECK( "UserNcseqEntitiesCollect", "ProFeatureGeomitemVisit()",
err );
err = ProSelectionAlloc( NULL, (ProModelitem*)&geom_item, &selection );
ERROR_CHECK( "UserNcseqEntitiesCollect", "ProSelectionAlloc()", err );
ProSelectionCopy( selection, &seq_ents->prof_mill_surf );
seq_ents->prof_mill_surf_found = PRO_B_TRUE;
}
}
else if ( feat_type == PRO_FEAT_CURVE )
{
err = ProModelitemNameGet( feature, w_name );
ERROR_CHECK( "UserNcseqEntitiesCollect", "ProModelitemNameGet()", err );
ProWstringToString( name, w_name );
if ( !seq_ents->face_mill_wind_found &&
!strcmp( name,"FACE_MILL_WINDOW" ) )
{
err = ProSelectionAlloc( NULL, feature, &selection );
ERROR_CHECK( "UserNcseqEntitiesCollect", "ProSelectionAlloc()", err );
ProSelectionCopy( selection, &seq_ents->face_mill_window );
seq_ents->face_mill_wind_found = PRO_B_TRUE;
}
else if ( !seq_ents->pocket_mill_wind_found &&
!strcmp( name,"ROUGH_MILL_WINDOW" ) )
{
err = ProSelectionAlloc( NULL, feature, &selection );
ERROR_CHECK( "UserNcseqEntitiesCollect", "ProSelectionAlloc()", err );
ProSelectionCopy( selection, &seq_ents->pocket_mill_window );
seq_ents->pocket_mill_wind_found = PRO_B_TRUE;
}
else if ( !seq_ents->traj_curve_found &&
!strcmp( name,"TRAJ_CURVE" ) )
{
err = ProFeatureGeomitemVisit( feature, PRO_CURVE, UserGeomItemGet,
NULL, (ProAppData)&geom_item );
ERROR_CHECK( "UserNcseqEntitiesCollect", "ProFeatureGeomitemVisit()",
err );
err = ProSelectionAlloc( NULL, (ProModelitem*)&geom_item,
&selection );
ERROR_CHECK( "UserNcseqEntitiesCollect", "ProSelectionAlloc()", err );
ProSelectionCopy( selection, &seq_ents->traj_curve );
seq_ents->traj_curve_found = PRO_B_TRUE;
}
}
else if ( !seq_ents->retract_found && feat_type == PRO_FEAT_DATUM )
{
err = ProModelitemNameGet( feature, w_name );
ERROR_CHECK( "UserNcseqEntitiesCollect", "ProModelitemNameGet()", err );
ProWstringToString( name, w_name );
if ( !strcmp( name,"RETRACT_PLANE" ) )
{
err = ProFeatureGeomitemVisit( feature, PRO_SURFACE, UserGeomItemGet,
NULL, (ProAppData)&geom_item );
ERROR_CHECK( "UserNcseqEntitiesCollect", "ProFeatureGeomitemVisit()",
err );
err = ProSelectionAlloc( NULL, (ProModelitem*)&geom_item,
&selection );
ERROR_CHECK( "UserNcseqEntitiesCollect", "ProSelectionAlloc()", err );
ProSelectionCopy( selection, &seq_ents->retract_plane );
seq_ents->retract_found = PRO_B_TRUE;
}
}
else if ( !seq_ents->csys_found && feat_type == PRO_FEAT_CSYS )
{
err = ProModelitemNameGet( feature, w_name );
ERROR_CHECK( "UserNcseqEntitiesCollect", "ProModelitemNameGet()", err );
ProWstringToString( name, w_name );
if ( !strcmp( name,"MACH_CSYS" ) )
{
err = ProFeatureGeomitemVisit( feature, PRO_CSYS, UserGeomItemGet,
NULL, &geom_item );
ERROR_CHECK( "UserNcseqEntitiesCollect", "ProFeatureGeomitemVisit()",
err );
err = ProSelectionAlloc( NULL, (ProModelitem*)&geom_item, &selection );
ERROR_CHECK( "UserNcseqEntitiesCollect", "ProSelectionAlloc()", err );
ProSelectionCopy( selection, &seq_ents->csys );
err = ProSelectionHighlight( seq_ents->csys, PRO_COLOR_WARNING );
ERROR_CHECK( "UserNcseqEntitiesCollect","ProSelectionHighlight()", err );
seq_ents->csys_found = PRO_B_TRUE;
}
}
if ( seq_ents->oper_found &&
seq_ents->retract_found &&
seq_ents->face_mill_wind_found &&
seq_ents->pocket_mill_wind_found &&
seq_ents->prof_mill_surf_found &&
seq_ents->traj_curve_found &&
seq_ents->csys_found )
{
return PRO_TK_STOP_VISIT;
}
return PRO_TK_NO_ERROR;
}
/*====================================================================*\
FUNCTION : UserCollectAxesToDrill
PURPOSE : Finds all axes in part
\*====================================================================*/
ProError UserCollectAxesToDrill(
/*--------------------------------------------------------------------*/
ProAssembly assembly,
ProSelection **p_sel_arr
)
/*--------------------------------------------------------------------*/
{
ProError err = PRO_TK_NO_ERROR;
ProAsmcomp *asmcomps = NULL;
ProAsmcomppath comp_path;
ProIdTable memb_id_tab;
ProAxis *axes = NULL;
ProMdlfileType mdltype;
ProSelection selection;
ProMdl model;
ProFamilyMdlName w_name;
char name[PRO_FAMILY_MDLNAME_SIZE];
ProGeomitem item;
int ii, num_comp = 0;
int jj, num_axes = 0;
ProBool found = PRO_B_FALSE;
err = ProUtilCollectAsmcomp( assembly, &asmcomps );
ERROR_CHECK( "UserCollectAxesToDrill", "ProUtilCollectAsmcomp()", err );
ProArraySizeGet( (ProArray)asmcomps, &num_comp );
for ( ii = 0; ii < num_comp; ii++ )
{
err = ProAsmcompMdlMdlnameGet( &asmcomps[ii], &mdltype, w_name );
ERROR_CHECK( "UserCollectAxesToDrill", "ProAsmcompMdlMdlnameGet()", err );
ProWstringToString( name, w_name );
if ( !strcmp( name,"COVER-PLATE" ) )
{
err = ProAsmcompMdlGet( &asmcomps[ii], &model );
ERROR_CHECK( "UserCollectAxesToDrill", "ProAsmcompMdlGet()", err );
memb_id_tab[0] = asmcomps[ii].id;
memb_id_tab[1] = -1;
err = ProAsmcomppathInit( assembly, memb_id_tab, 1, &comp_path );
ERROR_CHECK( "UserCollectAxesToDrill", "ProAsmcomppathInit()", err );
found = PRO_B_TRUE;
break;
}
}
if ( !found )
return ( PRO_TK_E_NOT_FOUND );
err = ProUtilCollectSolidAxis( (ProSolid)model, &axes );
ERROR_CHECK( "UserCollectAxesToDrill", "ProUtilCollectSolidAxis()", err );
err = ProArraySizeGet( axes, &num_axes );
ERROR_CHECK( "UserCollectAxesToDrill", "ProArraySizeGet()", err );
err = ProArrayAlloc( 0, sizeof(ProSelection), 1, (ProArray*)p_sel_arr );
ERROR_CHECK( "UserCollectAxesToDrill", "ProArrayAlloc()", err );
for ( jj = 0; jj < num_axes; jj++ )
{
err = ProAxisToGeomitem( (ProSolid)model, axes[jj], &item );
ERROR_CHECK( "UserCollectAxesToDrill", "ProAxisToGeomitem()", err );
err = ProModelitemNameGet( (ProModelitem*)&item, w_name );
ERROR_CHECK( "UserNcseqEntitiesCollect", "ProModelitemNameGet()", err );
ProWstringToString( name, w_name );
if ( !strcmp( name,"A_1" ) ||
!strcmp( name,"A_9" ) ||
!strcmp( name,"A_10" ) ||
!strcmp( name,"A_11" ) )
{
err = ProSelectionAlloc( &comp_path, (ProModelitem*)&item, &selection );
ERROR_CHECK( "UserNcseqEntitiesCollect", "ProSelectionAlloc()", err );
err = ProArrayObjectAdd( (ProArray *)p_sel_arr, PRO_VALUE_UNUSED, 1,
&selection );
ERROR_CHECK( "UserNcseqEntitiesCollect", "ProArrayObjectAdd()", err );
}
}
ProArrayFree( (ProArray*)&asmcomps );
ProArrayFree( (ProArray*)&axes );
return ( err );
}
/*====================================================================*\
FUNCTION : UserOperWorkcellGet
PURPOSE : Finds workcell of operation
\*====================================================================*/
ProError UserOperWorkcellGet(
/*--------------------------------------------------------------------*/
ProSelection operation,
ProSelection *p_workcell
)
/*--------------------------------------------------------------------*/
{
ProError err = PRO_TK_NO_ERROR;
ProElement elem_tree;
ProElement element;
ProFeature oper_feat;
ProReference wcell_ref;
ProElempath path;
ProElempathItem wcell_ref_path_item[] =
{
{ PRO_ELEM_PATH_ITEM_TYPE_ID, PRO_E_MFG_WCELL_REF }
};
err = ProSelectionModelitemGet( operation, &oper_feat );
ERROR_CHECK( "UserOperWorkcellGet", "ProSelectionModelitemGet", err );
err = ProFeatureElemtreeExtract( &oper_feat, NULL,
PRO_FEAT_EXTRACT_NO_OPTS,
&elem_tree );
ERROR_CHECK( "UserOperWorkcellGet", "ProSelectionModelitemGet", err );
ProElempathAlloc( &path );
ProElempathDataSet( path, wcell_ref_path_item, 1 );
err = ProElemtreeElementGet( elem_tree, path, &element );
ERROR_CHECK( "UserOperWorkcellGet", "ProElemtreeElementGet", err );
ProElempathFree( &path );
err = ProElementReferenceGet( element, NULL, &wcell_ref );
ERROR_CHECK( "UserOperWorkcellGet", "ProElementReferenceGet", err );
err = ProReferenceToSelection( wcell_ref, p_workcell );
ERROR_CHECK( "UserOperWorkcellGet", "ProReferenceToSelection", err );
err = ProElementFree( &elem_tree );
ERROR_CHECK( "UserOperWorkcellGet", "ProElementFree", err );
return ( err );
}
/*====================================================================*\
Function : UserMfgModelFeatureCreate
Purpose : Create a feature in mfg model from elem tree
\*====================================================================*/
ProError UserMfgModelFeatureCreate (
/*--------------------------------------------------------------------*/
ProMfg mfg_model,
ProElement elem_tree,
ProFeature *p_feature
)
/*--------------------------------------------------------------------*/
{
ProError err = PRO_TK_NO_ERROR;
ProErrorlist errors;
ProSolid mfg_solid;
ProModelitem modelitem;
ProSelection selection;
ProFeatureCreateOptions fd_opts[] = { PRO_FEAT_CR_DEFINE_MISS_ELEMS };
err = ProMfgSolidGet( mfg_model, &mfg_solid );
ERROR_CHECK( "UserMfgModelFeatureCreate", "ProMfgSolidGet()", err );
err = ProMdlToModelitem( mfg_solid, &modelitem );
ERROR_CHECK( "UserMfgModelFeatureCreate", "ProMdlToModelitem()", err );
err = ProSelectionAlloc( NULL, &modelitem, &selection );
ERROR_CHECK( "UserMfgModelFeatureCreate", "ProSelectionAlloc()", err );
err = ProFeatureCreate( selection, elem_tree, fd_opts, 1,
p_feature, &errors );
if ( err != PRO_TK_NO_ERROR )
ProTKFprintf( stderr, "Error in element %d\n",
errors.error_list[0].err_item_id );
return ( (int)err );
}
/*====================================================================*\
FUNCTION : UserMachSurfByWindowSet
PURPOSE : Set machining surfaces by mill window compound element
\*====================================================================*/
ProError UserMachSurfByWindowSet(
/*--------------------------------------------------------------------*/
ProSelection mill_window,
ProElement mach_surf_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 elem_table[] =
{
{ PRO_E_MACH_SURF_OPT, PRO_VALUE_TYPE_INT },
{ PRO_E_MFG_MILL_WIND_SRF, PRO_VALUE_TYPE_SELECTION }
};
table_size = sizeof( elem_table ) / sizeof( ElemTable );
for ( ii = 0; ii < table_size; ii++ )
{
err = ProElementAlloc( elem_table[ii].elem_type, &element );
ERROR_CHECK( "UserMachSurfByWindowSet","ProElementAlloc()", err );
switch ( elem_table[ii].elem_type )
{
case PRO_E_MACH_SURF_OPT:
err = ProElementIntegerSet ( element, PRO_MACH_SURF_OPT_MILL_WIND );
ERROR_CHECK( "UserMachSurfByWindowSet"," ProElementIntegerSet",err );
break;
case PRO_E_MFG_MILL_WIND_SRF:
selection = mill_window;
err = ProSelectionToReference(selection , &reference );
ERROR_CHECK( "UserMachSurfByWindowSet()", "ProSelectionToReference",
err );
err = ProElementReferenceSet( element, reference );
ERROR_CHECK( "UserMachSurfByWindowSet()", "ProElementReferenceSet", err );
break;
default:
ProTKFprintf( stderr, "Error setting element type\n" );
err = PRO_TK_GENERAL_ERROR;
ERROR_CHECK( "UserMachSurfByWindowSet","UserMachSurfByWindowSet()",
err );
break;
}
err = ProElemtreeElementAdd( mach_surf_elem, NULL, element );
ERROR_CHECK( "UserMachSurfByWindowSet","ProElemtreeElementAdd", err );
}
return ( err );
}
/*====================================================================*\
FUNCTION : UserCurveCollectionSet
PURPOSE : Set curve collection by curve
\*====================================================================*/
ProError UserCurveCollectionSet(
/*--------------------------------------------------------------------*/
ProSelection curve_feat,
ProElement coll_elem
)
/*--------------------------------------------------------------------*/
{
ProError err = PRO_TK_NO_ERROR;
ProElement element;
ProReference reference;
ProCollection collection;
ProCrvcollinstr instr;
err = ProCrvcollectionAlloc( &collection );
ERROR_CHECK( "UserCurveCollectionSet","ProCrvcollectionAlloc", err );
err = ProCrvcollinstrAlloc( PRO_CURVCOLL_CURVE_INSTR, &instr );
ERROR_CHECK( "UserCurveCollectionSet","ProSrfcollinstrAlloc", err );
err = ProCrvcollinstrAttributeSet( instr, PRO_CURVCOLL_NO_ATTR );
ERROR_CHECK( "UserCurveCollectionSet", "ProCrvcollinstrAttributeSet", err );
err = ProSelectionToReference( curve_feat, &reference );
ERROR_CHECK( "UserCurveCollectionSet","ProSelectionToReference", err );
err = ProCrvcollinstrReferenceAdd( instr, reference );
ERROR_CHECK( "UserCurveCollectionSet", "ProCrvcollinstrReferenceAdd", err );
err = ProCrvcollectionInstructionAdd( collection, instr );
ERROR_CHECK( "UserCurveCollectionSet", "ProCrvcollectionInstructionAdd",
err );
err = ProElementCollectionSet( coll_elem, collection );
ERROR_CHECK( "UserCurveCollectionSet", "ProElementCollectionSet", err );
return ( err );
}
/*====================================================================*\
FUNCTION : UserSurfCollectionByMillSurfSet
PURPOSE : Set surfaces collection by mill surface
\*====================================================================*/
ProError UserSurfCollectionByMillSurfSet(
/*--------------------------------------------------------------------*/
ProSelection mill_surface,
ProElement coll_elem
)
/*--------------------------------------------------------------------*/
{
ProError err = PRO_TK_NO_ERROR;
ProElement element;
ProValueData value_data;
ProValue value;
ProReference reference;
ProCollection collection;
ProSrfcollinstr instr;
ProSrfcollref isntr_ref;
err = ProSrfcollectionAlloc( &collection );
ERROR_CHECK( "UserSurfCollectionByMillSurfSet","ProSrfcollectionAlloc",
err );
err = ProSrfcollinstrAlloc( PRO_SURFCOLL_QUILT_SRFS, PRO_B_TRUE, &instr );
ERROR_CHECK( "UserSurfCollectionByMillSurfSet","ProSrfcollinstrAlloc",
err );
err = ProSrfcollinstrIncludeSet( instr, 1 );
ERROR_CHECK( "UserSurfCollectionByMillSurfSet","ProSrfcollinstrIncludeSet",
err );
err = ProSelectionToReference( mill_surface, &reference );
ERROR_CHECK( "UserSurfCollectionByMillSurfSet","ProSelectionToReference",
err );
err = ProSrfcollrefAlloc( PRO_SURFCOLL_REF_GENERIC, reference, &isntr_ref );
ERROR_CHECK( "UserSurfCollectionByMillSurfSet","ProSrfcollrefAlloc", err );
err = ProSrfcollinstrReferenceAdd( instr, isntr_ref );
ERROR_CHECK( "UserSurfCollectionByMillSurfSet","ProSrfcollinstrReferenceAdd",
err );
err = ProSrfcollectionInstructionAdd( collection, instr );
ERROR_CHECK( "UserSurfCollectionByMillSurfSet",
"ProSrfcollectionInstructionAdd", err );
err = ProElementCollectionSet( coll_elem, collection );
ERROR_CHECK( "UserSurfCollectionByMillSurfSet", "ProElementCollectionSet",
err );
return ( err );
}
/*====================================================================*\
FUNCTION : UserMfgOffsetSet
PURPOSE : Set mfg offset element
\*====================================================================*/
ProError UserMfgOffsetSet(
/*--------------------------------------------------------------------*/
ProBool apply_offset,
ProMaterialRmvSide material_side,
ProBool flip_crv_dir,
ProElement offset_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_OFFSET_CUT, PRO_VALUE_TYPE_INT },
{ PRO_E_MFG_MAT_TO_RMV, PRO_VALUE_TYPE_INT },
{ PRO_E_MFG_DRV_SRF_DIR, PRO_VALUE_TYPE_INT }
};
table_size = sizeof( elem_table ) / sizeof( ElemTable );
for ( ii = 0; ii < table_size; ii++ )
{
err = ProElementAlloc( elem_table[ii].elem_type, &element );
ERROR_CHECK( "UserMfgOffsetSet","ProElementAlloc()", err );
switch ( elem_table[ii].elem_type )
{
case PRO_E_MFG_OFFSET_CUT:
err = ProElementIntegerSet ( element, (int)apply_offset );
ERROR_CHECK( "UserMfgOffsetSet","ProElementIntegerSet()", err );
break;
case PRO_E_MFG_MAT_TO_RMV:
err = ProElementIntegerSet ( element, (int)material_side );
ERROR_CHECK( "UserMfgOffsetSet","ProElementIntegerSet()", err );
break;
case PRO_E_MFG_DRV_SRF_DIR:
err = ProElementIntegerSet ( element, (int)flip_crv_dir );
ERROR_CHECK( "UserMfgOffsetSet","ProElementIntegerSet()", err );
break;
default:
ProTKFprintf( stderr, "Error setting element type\n" );
err = PRO_TK_GENERAL_ERROR;
break;
}
err = ProElemtreeElementAdd( offset_elem, NULL, element );
ERROR_CHECK( "UserMfgOffsetSet","ProElemtreeElementAdd", err );
}
return ( err );
}
/*====================================================================*\
FUNCTION : UserTrajCurveSet
PURPOSE : Set trajectory curve collection compound element
\*====================================================================*/
ProError UserTrajCurveSet(
/*--------------------------------------------------------------------*/
ProSelection curve_feat,
ProElement traj_curve_elem
)
/*--------------------------------------------------------------------*/
{
ProError err = PRO_TK_NO_ERROR;
ProElement element;
err = ProElementAlloc( PRO_E_STD_CURVE_COLLECTION_APPL, &element );
ERROR_CHECK( "UserTrajCurveByCurveFeatSet","ProElementAlloc()", err );
err = UserCurveCollectionSet( curve_feat, element );
ERROR_CHECK( "UserTrajCurveByCurveFeatSet", "UserCurveCollectionSet()",
err );
err = ProElemtreeElementAdd( traj_curve_elem, NULL, element );
ERROR_CHECK( "UserTrajCurveByCurveFeatSet", "ProElemtreeElementAdd", err );
return ( err );
}
/*====================================================================*\
FUNCTION : UserMachSurfCollectionByMillSurfSet
PURPOSE : Set surfaces collection compound element
\*====================================================================*/
ProError UserMachSurfCollectionByMillSurfSet(
/*--------------------------------------------------------------------*/
ProSelection mill_surface,
ProElement mach_surf_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_MACH_SURF_REF_TYPE, PRO_VALUE_TYPE_INT },
{ PRO_E_STD_SURF_COLLECTION_APPL, SURF_COLLECTION }
};
table_size = sizeof( elem_table ) / sizeof( ElemTable );
for ( ii = 0; ii < table_size; ii++ )
{
err = ProElementAlloc( elem_table[ii].elem_type, &element );
ERROR_CHECK( "UserMachSurfCollectionByMillSurfSet","ProElementAlloc()",
err );
switch ( elem_table[ii].elem_type )
{
case PRO_E_MACH_SURF_REF_TYPE:
err = ProElementIntegerSet ( element, PRO_SURF_REF_TYPE_MILL_MVOLSRF );
ERROR_CHECK( "UserMachSurfCollectionByMillSurfSet",
"ProElementIntegerSet()", err );
break;
case PRO_E_STD_SURF_COLLECTION_APPL:
err = UserSurfCollectionByMillSurfSet( mill_surface, element );
ERROR_CHECK( "UserMachSurfCollectionByMillSurfSet",
"UserSurfCollectionByMillSurfSet()", err );
break;
default:
ProTKFprintf( stderr, "Error setting element type\n" );
err = PRO_TK_GENERAL_ERROR;
ERROR_CHECK( "UserMachSurfCollectionByMillSurfSet",
"UserMachSurfCollectionByMillSurfSet()", err );
break;
}
err = ProElemtreeElementAdd( mach_surf_elem, NULL, element );
ERROR_CHECK( "UserMachSurfCollectionByMillSurfSet",
"ProElemtreeElementAdd", err );
}
return ( err );
}
/*====================================================================*\
FUNCTION : UserMachSurfByMillSurfSet
PURPOSE : Set machining surfaces by mill surface
\*====================================================================*/
ProError UserMachSurfByMillSurfSet(
/*--------------------------------------------------------------------*/
ProSelection mill_surf,
ProElement mach_surf_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_MACH_SURF_OPT, PRO_VALUE_TYPE_INT },
{ PRO_E_MACH_SURF_COMP, COMPOUND }
};
table_size = sizeof( elem_table ) / sizeof( ElemTable );
for ( ii = 0; ii < table_size; ii++ )
{
err = ProElementAlloc( elem_table[ii].elem_type, &element );
ERROR_CHECK( "UserMachSurfByWindowSet","ProElementAlloc()", err );
switch ( elem_table[ii].elem_type )
{
case PRO_E_MACH_SURF_OPT:
err = ProElementIntegerSet ( element, PRO_MACH_SURF_OPT_SURFACES );
ERROR_CHECK( "UserMachSurfByWindowSet","ProElementIntegerSet()", err );
break;
case PRO_E_MACH_SURF_COMP:
err = UserMachSurfCollectionByMillSurfSet( mill_surf, element );
ERROR_CHECK( "UserMachSurfByWindowSet()", "UserMachSurfCompSet", err );
break;
default:
ProTKFprintf( stderr, "Error setting element type\n" );
err = PRO_TK_GENERAL_ERROR;
ERROR_CHECK( "UserMachSurfByWindowSet","UserMachSurfByWindowSet()",
err );
break;
}
err = ProElemtreeElementAdd( mach_surf_elem, NULL, element );
ERROR_CHECK( "UserMachSurfByWindowSet","ProElemtreeElementAdd", err );
}
return ( err );
}
/*====================================================================*\
FUNCTION : UserMillWindowCompoundSet
PURPOSE : Set machining surfaces by mill window compound element
\*====================================================================*/
ProError UserMillWindowCompoundSet(
/*--------------------------------------------------------------------*/
ProSelection mill_win,
ProElement mill_win_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 elem_table[] =
{
{ PRO_E_MFG_MILL_WIND, PRO_VALUE_TYPE_SELECTION }
};
table_size = sizeof( elem_table ) / sizeof( ElemTable );
for ( ii = 0; ii < table_size; ii++ )
{
err = ProElementAlloc( elem_table[ii].elem_type, &element );
ERROR_CHECK( "UserMillWindowCompoundSet","ProElementAlloc()", err );
switch ( elem_table[ii].elem_type )
{
case PRO_E_MFG_MILL_WIND:
selection = mill_win;
break;
default:
ProTKFprintf( stderr, "Error setting element type\n" );
err = PRO_TK_GENERAL_ERROR;
ERROR_CHECK( "UserMillWindowCompoundSet","UserMillWindowCompoundSet()",
err );
break;
}
if ( elem_table[ii].val_type == PRO_VALUE_TYPE_SELECTION )
{
err = ProSelectionToReference( selection, &reference );
ERROR_CHECK( "UserMillWindowCompoundSet()", "ProSelectionToReference",
err );
err = ProElementReferenceSet( element, reference );
ERROR_CHECK( "UserMillWindowCompoundSet()", "ProElementReferenceSet",
err );
}
err = ProElemtreeElementAdd( mill_win_elem, NULL, element );
ERROR_CHECK( "UserMillWindowCompoundSet","ProElemtreeElementAdd", err );
}
return ( err );
}
/*====================================================================*\
Function : UserFacingCreate
Purpose : Create a facing sequence feature using element tree
\*====================================================================*/
ProError UserFacingCreate (
/*--------------------------------------------------------------------*/
ProMfg mfg_model,
ProName feat_name,
ProSelection operation,
ProSelection retract_plane,
ProSelection seq_csys,
ProSelection mill_window,
ProMfgToolHeadType head_num,
int pocket_num,
wchar_t *tool_name
)
/*--------------------------------------------------------------------*/
{
ProError err = PRO_TK_NO_ERROR;
ProElement element = NULL; /* Individual element */
ProElement seq_elem_tree = NULL; /* Entire tree */
ProFeature seq_feature;
int ii = 0, size = 0;
int n_dbl_params = 0;
int n_str_params = 0;
static ElemTable seq_elem_table[] =
{
{ PRO_E_MACH_SURFS, COMPOUND }
};
static MfgPrmDblValue dbl_params[] =
{
{ "CUT_FEED", 200.0 }, /* required for facing */
{ "STEP_DEPTH", 10.0 }, /* required for facing */
{ "STEP_OVER", 50.0 }, /* required for facing */
{ "CLEAR_DIST", 1.0 }, /* required for facing */
{ "SPINDLE_SPEED", 15000.0 }, /* required for facing */
{ "RETRACT_FEED", 500.0 } /* example (not required) */
};
static MfgPrmStrValue str_params[] = /* examples (not required) */
{
{ "SCAN_TYPE", L"TYPE_1" }, /* Predefined SCAN_TYPE value */
{ "NCL_FILE", L"Facing" } /* Cl file name */
};
n_dbl_params = sizeof( dbl_params ) / sizeof( MfgPrmDblValue );
n_str_params = sizeof( str_params ) / sizeof( MfgPrmStrValue );
size = sizeof( seq_elem_table ) / sizeof( ElemTable );
/*********************************************/
/* Allocate element tree */
/*********************************************/
err = ProElementAlloc( PRO_E_FEATURE_TREE, &seq_elem_tree );
ERROR_CHECK( "UserFacingCreate", "ProElementAlloc()", err );
/************************************************/
/* Init elem tree with common sequence elements */
/************************************************/
err = UserNcSeqTreeCommonElementsAdd( mfg_model,
PRO_FEAT_MILL,
PRO_NCSEQ_FACE_MILL,
feat_name,
operation,
retract_plane,
seq_csys,
head_num,
pocket_num,
tool_name,
dbl_params,
n_dbl_params,
str_params,
n_str_params,
seq_elem_tree );
ERROR_CHECK( "UserFacingCreate()", "UserNcSeqTreeCommonElementsAdd", err );
/*********************************************/
/* Add elements specific for facing sequence */
/*********************************************/
for ( ii = 0 ; ii < size; ii++ )
{
err = ProElementAlloc( seq_elem_table[ii].elem_type, &element );
ERROR_CHECK( "UserFacingCreate","ProElementAlloc()", err );
switch ( seq_elem_table[ii].elem_type )
{
case PRO_E_MACH_SURFS:
err = UserMachSurfByWindowSet( mill_window, element );
ERROR_CHECK( "UserFacingCreate()", "UserMachSurfByWindowSet", err );
break;
default:
ProTKFprintf( stderr, "Error setting element type\n" );
err = PRO_TK_GENERAL_ERROR;
ERROR_CHECK( "UserFacingCreate", "UserFacingCreate()", err );
break;
}
err = ProElemtreeElementAdd( seq_elem_tree, NULL, element );
ERROR_CHECK( "UserFacingCreate", "ProElemtreeElementAdd()", err );
}
/*********************************************/
/* Display element tree */
/*********************************************/
ProUtilElementtreePrint( seq_elem_tree, PRO_TEST_INFO_WINDOW, NULL );
/*********************************************/
/* Create feature */
/*********************************************/
err = UserMfgModelFeatureCreate( mfg_model, seq_elem_tree, &seq_feature );
ERROR_CHECK( "UserFacingCreate", "UserMfgModelFeatureCreate()", err );
err = ProElementFree( &seq_elem_tree );
ERROR_CHECK( "UserFacingCreate", "ProElementFree()", err );
return ( (int)err );
}
/*====================================================================*\
Function : UserTrajectoryCreate
Purpose : Create a trajectory milling feature using element tree
\*====================================================================*/
ProError UserTrajectoryCreate (
/*--------------------------------------------------------------------*/
ProMfg mfg_model,
ProName feat_name,
ProSelection operation,
ProSelection retract_plane,
ProSelection seq_csys,
ProSelection curve,
ProMfgToolHeadType head_num,
int pocket_num,
wchar_t *tool_name
)
/*--------------------------------------------------------------------*/
{
ProError err = PRO_TK_NO_ERROR;
ProElement element = NULL; /* Individual element */
ProElement seq_elem_tree = NULL; /* Entire tree */
ProFeature seq_feature;
int ii = 0, size = 0;
int n_dbl_params = 0;
static ElemTable seq_elem_table[] =
{
{ PRO_E_TOOL_MTN_ARR, ARRAY },
};
static MfgPrmDblValue dbl_params[] =
{
{ "CUT_FEED", 200.0 }, /* required for trajectory */
{ "CLEAR_DIST", 1.0 }, /* required for trajectory */
{ "SPINDLE_SPEED", 15000.0 } /* required for trajectory */
};
n_dbl_params = sizeof( dbl_params ) / sizeof( MfgPrmDblValue );
size = sizeof( seq_elem_table ) / sizeof( ElemTable );
/*********************************************/
/* Allocate element tree */
/*********************************************/
err = ProElementAlloc( PRO_E_FEATURE_TREE, &seq_elem_tree );
ERROR_CHECK( "UserTrajectoryCreate", "ProElementAlloc()", err );
/************************************************/
/* Init elem tree with common sequence elements */
/************************************************/
err = UserNcSeqTreeCommonElementsAdd( mfg_model,
PRO_FEAT_MILL,
PRO_NCSEQ_TRAJ_MILL_STEP,
feat_name,
operation,
retract_plane,
seq_csys,
head_num,
pocket_num,
tool_name,
dbl_params,
n_dbl_params,
NULL,
0,
seq_elem_tree );
ERROR_CHECK( "UserTrajectoryCreate()", "UserNcSeqTreeCommonElementsAdd",
err );
/*************************************************/
/* Add elements specific for trajectory sequence */
/*************************************************/
for ( ii = 0 ; ii < size; ii++ )
{
err = ProElementAlloc( seq_elem_table[ii].elem_type, &element );
ERROR_CHECK( "UserTrajectoryCreate","ProElementAlloc()", err );
switch ( seq_elem_table[ii].elem_type )
{
case PRO_E_TOOL_MTN_ARR:
err = UserTrajToolMtnArrSet( curve, element );
ERROR_CHECK( "UserTrajectoryCreate","UserTrajToolMtnArrSet()", err );
break;
default:
ProTKFprintf( stderr, "Error setting element type\n" );
err = PRO_TK_GENERAL_ERROR;
ERROR_CHECK( "UserTrajectoryCreate","UserTrajectoryCreate()", err );
break;
}
err = ProElemtreeElementAdd( seq_elem_tree, NULL, element );
ERROR_CHECK( "UserTrajectoryCreate", "ProElemtreeElementAdd()", err );
}
/*********************************************/
/* Display element tree */
/*********************************************/
ProUtilElementtreePrint( seq_elem_tree, PRO_TEST_INFO_WINDOW, NULL );
/*********************************************/
/* Create feature */
/*********************************************/
err = UserMfgModelFeatureCreate( mfg_model, seq_elem_tree, &seq_feature );
ERROR_CHECK( "UserTrajectoryCreate", "UserMfgModelFeatureCreate()", err );
err = ProElementFree( &seq_elem_tree );
ERROR_CHECK( "UserTrajectoryCreate", "ProElementFree()", err );
return ( (int)err );
}
/*====================================================================*\
Function : UserCurveTrajCreate
Purpose : Create a roughing milling feature using element tree
\*====================================================================*/
ProError UserCurveTrajCreate (
/*--------------------------------------------------------------------*/
ProMfg mfg_model,
ProName feat_name,
ProSelection operation,
ProSelection retract_plane,
ProSelection seq_csys,
ProSelection curve_feat,
ProMfgToolHeadType head_num,
int pocket_num,
wchar_t *tool_name
)
/*--------------------------------------------------------------------*/
{
ProError err = PRO_TK_NO_ERROR;
ProElement element = NULL; /* Individual element */
ProElement seq_elem_tree = NULL; /* Entire tree */
ProFeature seq_feature;
int ii = 0, size = 0;
int n_dbl_params = 0;
int n_str_params = 0;
static ElemTable seq_elem_table[] =
{
{ PRO_E_MFG_TRAJ_CRV, COMPOUND },
{ PRO_E_MFG_OFFSET, COMPOUND }
};
static MfgPrmDblValue dbl_params[] =
{
{ "CUT_FEED", 200.0 }, /* required for 2-axis trajectory */
{ "CLEAR_DIST", 1.0 }, /* required for 2-axis trajectory */
{ "SPINDLE_SPEED", 15000.0 }, /* required for 2-axis trajectory */
{ "LEAD_IN_RADIUS", 60.0 },
{ "LEAD_OUT_RADIUS", 60.0 },
};
static MfgPrmStrValue str_params[] =
{
{ "LEAD_IN", L"YES" },
{ "LEAD_OUT", L"YES" }
};
n_dbl_params = sizeof( dbl_params ) / sizeof( MfgPrmDblValue );
n_str_params = sizeof( str_params ) / sizeof( MfgPrmStrValue );
size = sizeof( seq_elem_table ) / sizeof( ElemTable );
/*********************************************/
/* Allocate element tree */
/*********************************************/
err = ProElementAlloc( PRO_E_FEATURE_TREE, &seq_elem_tree );
ERROR_CHECK( "UserCurveTrajCreate", "ProElementAlloc()", err );
/************************************************/
/* Init elem tree with common sequence elements */
/************************************************/
err = UserNcSeqTreeCommonElementsAdd( mfg_model,
PRO_FEAT_MILL,
PRO_NCSEQ_FF_TRAJ_MILL,
feat_name,
operation,
retract_plane,
seq_csys,
head_num,
pocket_num,
tool_name,
dbl_params,
n_dbl_params,
str_params,
n_str_params,
seq_elem_tree );
ERROR_CHECK( "UserCurveTrajCreate()", "UserNcSeqTreeCommonElementsAdd", err );
/*************************************************/
/* Add elements specific for curve trajectory */
/*************************************************/
for ( ii = 0 ; ii < size; ii++ )
{
err = ProElementAlloc( seq_elem_table[ii].elem_type, &element );
ERROR_CHECK( "UserCurveTrajCreate","ProElementAlloc()", err );
switch ( seq_elem_table[ii].elem_type )
{
case PRO_E_MFG_TRAJ_CRV:
err = UserTrajCurveSet( curve_feat, element );
ERROR_CHECK( "UserCurveTrajCreate()", "UserTrajCurveSet", err );
break;
case PRO_E_MFG_OFFSET:
err = UserMfgOffsetSet( PRO_B_TRUE, PRO_MAT_RMV_LEFT, PRO_B_TRUE,
element );
ERROR_CHECK( "UserCurveTrajCreate", "UserMfgOffsetSet()", err );
break;
default:
ProTKFprintf( stderr, "Error setting element type\n" );
err = PRO_TK_GENERAL_ERROR;
ERROR_CHECK( "UserCurveTrajCreate","UserCurveTrajCreate()", err );
break;
}
err = ProElemtreeElementAdd( seq_elem_tree, NULL, element );
ERROR_CHECK( "UserCurveTrajCreate", "ProElemtreeElementAdd()", err );
}
/*********************************************/
/* Display element tree */
/*********************************************/
ProUtilElementtreePrint( seq_elem_tree, PRO_TEST_INFO_WINDOW, NULL );
/*********************************************/
/* Create feature */
/*********************************************/
err = UserMfgModelFeatureCreate( mfg_model, seq_elem_tree, &seq_feature );
ERROR_CHECK( "UserCurveTrajCreate", "UserMfgModelFeatureCreate()", err );
err = ProElementFree( &seq_elem_tree );
ERROR_CHECK( "UserCurveTrajCreate", "ProElementFree()", err );
return ( (int)err );
}
/*====================================================================*\
Function : UserFinishingCreate
Purpose : Create a finishing milling feature using element tree
\*====================================================================*/
ProError UserFinishingCreate (
/*--------------------------------------------------------------------*/
ProMfg mfg_model,
ProName feat_name,
ProSelection operation,
ProSelection retract_plane,
ProSelection seq_csys,
ProSelection mill_window,
ProMfgToolHeadType head_num,
int pocket_num,
wchar_t *tool_name
)
/*--------------------------------------------------------------------*/
{
ProError err = PRO_TK_NO_ERROR;
ProElement element = NULL; /* Individual element */
ProElement seq_elem_tree = NULL; /* Entire tree */
ProFeature seq_feature;
int ii = 0, size = 0;
int n_dbl_params = 0;
static ElemTable seq_elem_table[] =
{
{ PRO_E_MFG_CMP_MILL_WIND, COMPOUND },
};
static MfgPrmDblValue dbl_params[] =
{
{ "CUT_FEED", 200.0 }, /* required for finishing */
{ "STEP_OVER", 5.0 }, /* required for finishing */
{ "CLEAR_DIST", 1.0 }, /* required for finishing */
{ "SPINDLE_SPEED", 15000.0 } /* required for finishing */
};
n_dbl_params = sizeof( dbl_params ) / sizeof( MfgPrmDblValue );
size = sizeof( seq_elem_table ) / sizeof( ElemTable );
/*********************************************/
/* Allocate element tree */
/*********************************************/
err = ProElementAlloc( PRO_E_FEATURE_TREE, &seq_elem_tree );
ERROR_CHECK( "UserFinishingCreate", "ProElementAlloc()", err );
/************************************************/
/* Init elem tree with common sequence elements */
/************************************************/
err = UserNcSeqTreeCommonElementsAdd( mfg_model,
PRO_FEAT_MILL,
PRO_NCSEQ_CVNC_FINISH_MILL,
feat_name,
operation,
retract_plane,
seq_csys,
head_num,
pocket_num,
tool_name,
dbl_params,
n_dbl_params,
NULL,
0,
seq_elem_tree );
ERROR_CHECK( "UserFinishingCreate()", "UserNcSeqTreeCommonElementsAdd", err );
/*************************************************/
/* Add elements specific for finishing sequence */
/*************************************************/
for ( ii = 0 ; ii < size; ii++ )
{
err = ProElementAlloc( seq_elem_table[ii].elem_type, &element );
ERROR_CHECK( "UserFinishingCreate","ProElementAlloc()", err );
switch ( seq_elem_table[ii].elem_type )
{
case PRO_E_MFG_CMP_MILL_WIND:
err = UserMillWindowCompoundSet( mill_window, element );
ERROR_CHECK( "UserFinishingCreate","UserMillWindowCompoundSet()", err );
break;
default:
ProTKFprintf( stderr, "Error setting element type\n" );
err = PRO_TK_GENERAL_ERROR;
ERROR_CHECK( "UserFinishingCreate","UserFinishingCreate()", err );
break;
}
err = ProElemtreeElementAdd( seq_elem_tree, NULL, element );
ERROR_CHECK( "UserFinishingCreate", "ProElemtreeElementAdd()", err );
}
/*********************************************/
/* Display element tree */
/*********************************************/
ProUtilElementtreePrint( seq_elem_tree, PRO_TEST_INFO_WINDOW, NULL );
/*********************************************/
/* Create feature */
/*********************************************/
err = UserMfgModelFeatureCreate( mfg_model, seq_elem_tree, &seq_feature );
ERROR_CHECK( "UserFinishingCreate", "UserMfgModelFeatureCreate()", err );
err = ProElementFree( &seq_elem_tree );
ERROR_CHECK( "UserFinishingCreate", "ProElementFree()", err );
return ( (int)err );
}
/*====================================================================*\
Function : UserRoughingCreate
Purpose : Create a roughing milling feature using element tree
\*====================================================================*/
ProError UserRoughingCreate (
/*--------------------------------------------------------------------*/
ProMfg mfg_model,
ProName feat_name,
ProSelection operation,
ProSelection retract_plane,
ProSelection seq_csys,
ProSelection mill_window,
ProMfgToolHeadType head_num,
int pocket_num,
wchar_t *tool_name,
ProFeature *p_seq_feature
)
/*--------------------------------------------------------------------*/
{
ProError err = PRO_TK_NO_ERROR;
ProElement element = NULL; /* Individual element */
ProElement seq_elem_tree = NULL; /* Entire tree */
ProFeature seq_feature;
int ii = 0, size = 0;
int n_dbl_params = 0;
static ElemTable seq_elem_table[] =
{
{ PRO_E_MFG_CMP_MILL_WIND, COMPOUND },
};
static MfgPrmDblValue dbl_params[] =
{
{ "CUT_FEED", 200.0 }, /* required for roughing */
{ "STEP_OVER", 25.0 }, /* required for roughing */
{ "MAX_STEP_DEPTH", 5.0 }, /* required for roughing */
{ "CLEAR_DIST", 1.0 }, /* required for roughing */
{ "SPINDLE_SPEED", 15000.0 } /* required for roughing */
};
n_dbl_params = sizeof( dbl_params ) / sizeof( MfgPrmDblValue );
size = sizeof( seq_elem_table ) / sizeof( ElemTable );
/*********************************************/
/* Allocate element tree */
/*********************************************/
err = ProElementAlloc( PRO_E_FEATURE_TREE, &seq_elem_tree );
ERROR_CHECK( "UserRoughingCreate", "ProElementAlloc()", err );
/************************************************/
/* Init elem tree with common sequence elements */
/************************************************/
err = UserNcSeqTreeCommonElementsAdd( mfg_model,
PRO_FEAT_MILL,
PRO_NCSEQ_ROUGHVOL_MILL,
feat_name,
operation,
retract_plane,
seq_csys,
head_num,
pocket_num,
tool_name,
dbl_params,
n_dbl_params,
NULL,
0,
seq_elem_tree );
ERROR_CHECK( "UserRoughingCreate()", "UserNcSeqTreeCommonElementsAdd", err );
/*************************************************/
/* Add elements specific for roughing sequence */
/*************************************************/
for ( ii = 0 ; ii < size; ii++ )
{
err = ProElementAlloc( seq_elem_table[ii].elem_type, &element );
ERROR_CHECK( "UserRoughingCreate","ProElementAlloc()", err );
switch ( seq_elem_table[ii].elem_type )
{
case PRO_E_MFG_CMP_MILL_WIND:
err = UserMillWindowCompoundSet( mill_window, element );
ERROR_CHECK( "UserRoughingCreate","UserMillWindowCompoundSet()", err );
break;
default:
ProTKFprintf( stderr, "Error setting element type\n" );
err = PRO_TK_GENERAL_ERROR;
ERROR_CHECK( "UserRoughingCreate","UserRoughingCreate()", err );
break;
}
err = ProElemtreeElementAdd( seq_elem_tree, NULL, element );
ERROR_CHECK( "UserRoughingCreate", "ProElemtreeElementAdd()", err );
}
/*********************************************/
/* Display element tree */
/*********************************************/
ProUtilElementtreePrint( seq_elem_tree, PRO_TEST_INFO_WINDOW, NULL );
/*********************************************/
/* Create feature */
/*********************************************/
err = UserMfgModelFeatureCreate( mfg_model, seq_elem_tree, &seq_feature );
ERROR_CHECK( "UserRoughingCreate", "UserMfgModelFeatureCreate()", err );
if ( p_seq_feature != NULL )
*p_seq_feature = seq_feature;
err = ProElementFree( &seq_elem_tree );
ERROR_CHECK( "UserRoughingCreate", "ProElementFree()", err );
return ( (int)err );
}
/*====================================================================*\
Function : UserReRoughingCreate
Purpose : Create a re-roughing milling feature using element tree
\*====================================================================*/
ProError UserReRoughingCreate (
/*--------------------------------------------------------------------*/
ProMfg mfg_model,
ProName feat_name,
ProSelection operation,
ProSelection retract_plane,
ProSelection seq_csys,
ProSelection seq_sel,
ProMfgToolHeadType head_num,
int pocket_num,
wchar_t *tool_name
)
/*--------------------------------------------------------------------*/
{
ProError err = PRO_TK_NO_ERROR;
ProElement element = NULL; /* Individual element */
ProElement seq_elem_tree = NULL; /* Entire tree */
ProFeature seq_feature;
ProSelection selection;
ProReference reference;
int ii = 0, size = 0;
int n_dbl_params = 0;
static ElemTable seq_elem_table[] =
{
{ PRO_E_MFG_PREV_SEQ, PRO_VALUE_TYPE_SELECTION }
};
static MfgPrmDblValue dbl_params[] =
{
{ "CUT_FEED", 150.0 }, /* required for re-roughing */
{ "STEP_OVER", 9.0 }, /* required for re-roughing */
{ "MAX_STEP_DEPTH", 5.0 }, /* required for re-roughing */
{ "CLEAR_DIST", 1.0 }, /* required for re-roughing */
{ "SPINDLE_SPEED", 15000.0 } /* required for re-roughing */
};
n_dbl_params = sizeof( dbl_params ) / sizeof( MfgPrmDblValue );
size = sizeof( seq_elem_table ) / sizeof( ElemTable );
/*********************************************/
/* Allocate element tree */
/*********************************************/
err = ProElementAlloc( PRO_E_FEATURE_TREE, &seq_elem_tree );
ERROR_CHECK( "UserRoughingCreate", "ProElementAlloc()", err );
/************************************************/
/* Init elem tree with common sequence elements */
/************************************************/
err = UserNcSeqTreeCommonElementsAdd( mfg_model,
PRO_FEAT_MILL,
PRO_NCSEQ_REROUGH_MILL,
feat_name,
operation,
retract_plane,
seq_csys,
head_num,
pocket_num,
tool_name,
dbl_params,
n_dbl_params,
NULL,
0,
seq_elem_tree );
ERROR_CHECK( "UserReRoughingCreate()", "UserNcSeqTreeCommonElementsAdd",
err );
/**************************************************/
/* Add elements specific for re-roughing sequence */
/**************************************************/
for ( ii = 0 ; ii < size; ii++ )
{
err = ProElementAlloc( seq_elem_table[ii].elem_type, &element );
ERROR_CHECK( "UserReRoughingCreate","ProElementAlloc()", err );
switch ( seq_elem_table[ii].elem_type )
{
case PRO_E_MFG_PREV_SEQ:
selection = seq_sel;
break;
default:
ProTKFprintf( stderr, "Error setting element type\n" );
err = PRO_TK_GENERAL_ERROR;
ERROR_CHECK( "UserReRoughingCreate","UserReRoughingCreate()", err );
break;
}
if ( seq_elem_table[ii].val_type == PRO_VALUE_TYPE_SELECTION )
{
err = ProSelectionToReference( selection, &reference );
ERROR_CHECK( "UserReRoughingCreate()", "ProSelectionToReference", err );
err = ProElementReferenceSet( element, reference );
ERROR_CHECK( "UserReRoughingCreate()", "ProElementReferenceSet", err );
}
err = ProElemtreeElementAdd( seq_elem_tree, NULL, element );
ERROR_CHECK( "UserReRoughingCreate", "ProElemtreeElementAdd()", err );
}
/*********************************************/
/* Display element tree */
/*********************************************/
ProUtilElementtreePrint( seq_elem_tree, PRO_TEST_INFO_WINDOW, NULL );
/*********************************************/
/* Create feature */
/*********************************************/
err = UserMfgModelFeatureCreate( mfg_model, seq_elem_tree, &seq_feature );
ERROR_CHECK( "UserReRoughingCreate", "UserMfgModelFeatureCreate()", err );
err = ProElementFree( &seq_elem_tree );
ERROR_CHECK( "UserReRoughingCreate", "ProElementFree()", err );
return ( (int)err );
}
/*====================================================================*\
Function : UserProfilingCreate
Purpose : Create a profile milling feature using element tree
\*====================================================================*/
ProError UserProfilingCreate (
/*--------------------------------------------------------------------*/
ProMfg mfg_model,
ProName feat_name,
ProSelection operation,
ProSelection retract_plane,
ProSelection seq_csys,
ProSelection mill_surf,
ProMfgToolHeadType head_num,
int pocket_num,
wchar_t *tool_name,
ProFeature *p_seq_feature
)
/*--------------------------------------------------------------------*/
{
ProError err = PRO_TK_NO_ERROR;
ProElement element = NULL; /* Individual element */
ProElement seq_elem_tree = NULL; /* Entire tree */
ProFeature seq_feature;
int ii = 0, size = 0;
int n_dbl_params = 0;
static ElemTable seq_elem_table[] =
{
{ PRO_E_MACH_SURFS, COMPOUND },
};
static MfgPrmDblValue dbl_params[] =
{
{ "CUT_FEED", 200.0 }, /* required for profile milling */
{ "STEP_DEPTH", 25.0 }, /* required for profile milling */
{ "CLEAR_DIST", 1.0 }, /* required for profile milling */
{ "SPINDLE_SPEED", 15000.0 } /* required for profile milling */
};
n_dbl_params = sizeof( dbl_params ) / sizeof( MfgPrmDblValue );
size = sizeof( seq_elem_table ) / sizeof( ElemTable );
/*********************************************/
/* Allocate element tree */
/*********************************************/
err = ProElementAlloc( PRO_E_FEATURE_TREE, &seq_elem_tree );
ERROR_CHECK( "UserProfilingCreate", "ProElementAlloc()", err );
/************************************************/
/* Init elem tree with common sequence elements */
/************************************************/
err = UserNcSeqTreeCommonElementsAdd( mfg_model,
PRO_FEAT_MILL,
PRO_NCSEQ_PROF_SURF_MILL,
feat_name,
operation,
retract_plane,
seq_csys,
head_num,
pocket_num,
tool_name,
dbl_params,
n_dbl_params,
NULL,
0,
seq_elem_tree );
ERROR_CHECK( "UserProfilingCreate()", "UserNcSeqTreeCommonElementsAdd", err );
/*************************************************/
/* Add elements specific for profiling sequence */
/*************************************************/
for ( ii = 0 ; ii < size; ii++ )
{
err = ProElementAlloc( seq_elem_table[ii].elem_type, &element );
ERROR_CHECK( "UserProfilingCreate","ProElementAlloc()", err );
switch ( seq_elem_table[ii].elem_type )
{
case PRO_E_MACH_SURFS:
err = UserMachSurfByMillSurfSet( mill_surf, element );
ERROR_CHECK( "UserProfilingCreate()",
"UserMachSurfByMillSurfSet", err );
break;
default:
ProTKFprintf( stderr, "Error setting element type\n" );
err = PRO_TK_GENERAL_ERROR;
ERROR_CHECK( "UserProfilingCreate","UserProfilingCreate()", err );
break;
}
err = ProElemtreeElementAdd( seq_elem_tree, NULL, element );
ERROR_CHECK( "UserProfilingCreate", "ProElemtreeElementAdd()", err );
}
/*********************************************/
/* Display element tree */
/*********************************************/
ProUtilElementtreePrint( seq_elem_tree, PRO_TEST_INFO_WINDOW, NULL );
/*********************************************/
/* Create feature */
/*********************************************/
err = UserMfgModelFeatureCreate( mfg_model, seq_elem_tree, &seq_feature );
ERROR_CHECK( "UserProfilingCreate", "UserMfgModelFeatureCreate()", err );
if ( p_seq_feature != NULL )
*p_seq_feature = seq_feature;
err = ProElementFree( &seq_elem_tree );
ERROR_CHECK( "UserProfilingCreate", "ProElementFree()", err );
return ( (int)err );
}
/*====================================================================*\
Function : UserCSinkgCreate
Purpose : Create a countersink holemaking feature using element tree
\*====================================================================*/
ProError UserCSinkgCreate (
/*--------------------------------------------------------------------*/
ProMfg mfg_model,
ProName feat_name,
ProSelection operation,
ProSelection retract_plane,
ProSelection seq_csys,
double csink_diam,
ProMfgToolHeadType head_num,
int pocket_num,
wchar_t *tool_name
)
/*--------------------------------------------------------------------*/
{
ProError err = PRO_TK_NO_ERROR;
ProElement element = NULL; /* Individual element */
ProElement seq_elem_tree = NULL; /* Entire tree */
ProValueData value_data;
ProValue value;
ProFeature seq_feature;
int ii = 0, size = 0;
int n_dbl_params = 0;
static ElemTable seq_elem_table[] =
{
{ PRO_E_HOLEMAKING_TYPE, PRO_VALUE_TYPE_INT },
{ PRO_E_MFG_HOLEMAKING_CYCLE_TYPE, PRO_VALUE_TYPE_INT },
{ PRO_E_HOLESETS, ARRAY }
};
static MfgPrmDblValue dbl_params[] =
{
{ "CUT_FEED", 200.0 }, /* required for drilling */
{ "CLEAR_DIST", 1.0 }, /* required for drilling */
{ "SPINDLE_SPEED", 15000.0 } /* required for drilling */
};
n_dbl_params = sizeof( dbl_params ) / sizeof( MfgPrmDblValue );
size = sizeof( seq_elem_table ) / sizeof( ElemTable );
/*********************************************/
/* Allocate element tree */
/*********************************************/
err = ProElementAlloc( PRO_E_FEATURE_TREE, &seq_elem_tree );
ERROR_CHECK( "UserCSinkgCreate", "ProElementAlloc()", err );
/************************************************/
/* Init elem tree with common sequence elements */
/************************************************/
err = UserNcSeqTreeCommonElementsAdd( mfg_model,
PRO_FEAT_DRILL,
PRO_NCSEQ_HOLEMAKING,
feat_name,
operation,
retract_plane,
seq_csys,
head_num,
pocket_num,
tool_name,
dbl_params,
n_dbl_params,
NULL,
0,
seq_elem_tree );
ERROR_CHECK( "UserCSinkgCreate()", "UserCSinkgCreate", err );
/*********************************************/
/* Add elements specific for countersinking */
/*********************************************/
for ( ii = 0 ; ii < size; ii++ )
{
err = ProElementAlloc( seq_elem_table[ii].elem_type, &element );
ERROR_CHECK( "UserCSinkgCreate","ProElementAlloc()", err );
switch ( seq_elem_table[ii].elem_type )
{
case PRO_E_HOLEMAKING_TYPE:
err = ProElementIntegerSet ( element, PRO_HOLE_MK_CSINK );
ERROR_CHECK( "UserCSinkgCreate()", "ProElementIntegerSet", err );
break;
case PRO_E_MFG_HOLEMAKING_CYCLE_TYPE:
err = ProElementIntegerSet ( element, PRO_HM_CYCLE_TYPE_STANDARD );
ERROR_CHECK( "UserCSinkgCreate()", "ProElementIntegerSet", err );
break;
case PRO_E_HOLESETS:
err = UserCsinkHolesetArrSet( csink_diam, element );
ERROR_CHECK( "UserCSinkgCreate()", "UserCsinkHolesetArrSet", err );
break;
default:
ProTKFprintf( stderr, "Error setting element type\n" );
err = PRO_TK_GENERAL_ERROR;
ERROR_CHECK( "UserCSinkgCreate()", "UserCSinkgCreate", err );
break;
}
err = ProElemtreeElementAdd( seq_elem_tree, NULL, element );
ERROR_CHECK( "UserCSinkgCreate", "ProElemtreeElementAdd()", err );
}
/*********************************************/
/* Display element tree */
/*********************************************/
ProUtilElementtreePrint( seq_elem_tree, PRO_TEST_INFO_WINDOW, NULL );
/*********************************************/
/* Create feature */
/*********************************************/
err = UserMfgModelFeatureCreate( mfg_model, seq_elem_tree, &seq_feature );
ERROR_CHECK( "UserCSinkgCreate", "UserMfgModelFeatureCreate()", err );
err = ProElementFree( &seq_elem_tree );
ERROR_CHECK( "UserCSinkgCreate", "ProElementFree()", err );
return ( (int)err );
}
/*====================================================================*\
Function : UserDrillingCreate
Purpose : Create a holemaking feature using element tree
\*====================================================================*/
ProError UserDrillingCreate (
/*--------------------------------------------------------------------*/
ProMfg mfg_model,
ProName feat_name,
ProSelection operation,
ProSelection retract_plane,
ProSelection seq_csys,
ProSelection *axes,
ProMfgToolHeadType head_num,
int pocket_num,
wchar_t *tool_name
)
/*--------------------------------------------------------------------*/
{
ProError err = PRO_TK_NO_ERROR;
ProElement element = NULL; /* Individual element */
ProElement seq_elem_tree = NULL; /* Entire tree */
ProValueData value_data;
ProValue value;
ProFeature seq_feature;
int ii = 0, size = 0;
int n_dbl_params = 0;
static ElemTable seq_elem_table[] =
{
{ PRO_E_HOLEMAKING_TYPE, PRO_VALUE_TYPE_INT },
{ PRO_E_MFG_HOLEMAKING_CYCLE_TYPE, PRO_VALUE_TYPE_INT },
{ PRO_E_HOLESETS, ARRAY }
};
static MfgPrmDblValue dbl_params[] =
{
{ "CUT_FEED", 200.0 }, /* required for drilling */
{ "CLEAR_DIST", 1.0 }, /* required for drilling */
{ "SPINDLE_SPEED", 15000.0 } /* required for drilling */
};
n_dbl_params = sizeof( dbl_params ) / sizeof( MfgPrmDblValue );
size = sizeof( seq_elem_table ) / sizeof( ElemTable );
/*********************************************/
/* Allocate element tree */
/*********************************************/
err = ProElementAlloc( PRO_E_FEATURE_TREE, &seq_elem_tree );
ERROR_CHECK( "UserDrillingCreate", "ProElementAlloc()", err );
/************************************************/
/* Init elem tree with common sequence elements */
/************************************************/
err = UserNcSeqTreeCommonElementsAdd( mfg_model,
PRO_FEAT_DRILL,
PRO_NCSEQ_HOLEMAKING,
feat_name,
operation,
retract_plane,
seq_csys,
head_num,
pocket_num,
tool_name,
dbl_params,
n_dbl_params,
NULL,
0,
seq_elem_tree );
ERROR_CHECK( "UserDrillingCreate()", "UserNcSeqTreeCommonElementsAdd", err );
/*********************************************/
/* Add elements specific for drilling */
/*********************************************/
for ( ii = 0 ; ii < size; ii++ )
{
err = ProElementAlloc( seq_elem_table[ii].elem_type, &element );
ERROR_CHECK( "UserDrillingCreate","ProElementAlloc()", err );
switch ( seq_elem_table[ii].elem_type )
{
case PRO_E_HOLEMAKING_TYPE:
err = ProElementIntegerSet ( element, PRO_HOLE_MK_DRILL );
ERROR_CHECK( "UserDrillingCreate", "ProElementIntegerSet", err );
break;
case PRO_E_MFG_HOLEMAKING_CYCLE_TYPE:
err = ProElementIntegerSet ( element, PRO_HM_CYCLE_TYPE_STANDARD );
ERROR_CHECK( "UserDrillingCreate", "ProElementIntegerSet", err );
break;
case PRO_E_HOLESETS:
err = UserDrillHolesetArrSet( axes, element );
ERROR_CHECK( "UserDrillingCreate()", "UserDrillHolesetArrSet",
err );
break;
default:
ProTKFprintf( stderr, "Error setting element type\n" );
err = PRO_TK_GENERAL_ERROR;
ERROR_CHECK( "UserDrillingCreate()", "UserDrillingCreate", err );
break;
}
err = ProElemtreeElementAdd( seq_elem_tree, NULL, element );
ERROR_CHECK( "UserDrillingCreate", "ProElemtreeElementAdd()", err );
}
/*********************************************/
/* Display element tree */
/*********************************************/
ProUtilElementtreePrint( seq_elem_tree, PRO_TEST_INFO_WINDOW, NULL );
/*********************************************/
/* Create feature */
/*********************************************/
err = UserMfgModelFeatureCreate( mfg_model, seq_elem_tree, &seq_feature );
ERROR_CHECK( "UserDrillingCreate", "UserMfgModelFeatureCreate()", err );
err = ProElementFree( &seq_elem_tree );
ERROR_CHECK( "UserDrillingCreate", "ProElementFree()", err );
return ( (int)err );
}
/*====================================================================*\
Function : UserManualCycleCreate
Purpose : Create a manual cycle feature using element tree
\*====================================================================*/
ProError UserManualCycleCreate (
/*--------------------------------------------------------------------*/
ProMfg mfg_model,
ProName feat_name,
ProSelection operation,
ProSelection retract_plane,
ProSelection seq_csys,
ProMfgToolHeadType head_num,
int pocket_num,
wchar_t *tool_name
)
/*--------------------------------------------------------------------*/
{
ProError err = PRO_TK_NO_ERROR;
ProElement element = NULL; /* Individual element */
ProElement seq_elem_tree = NULL; /* Entire tree */
ProFeature seq_feature;
int ii = 0, size = 0;
int n_dbl_params = 0;
static ElemTable seq_elem_table[] =
{
{ PRO_E_TOOL_MTN_ARR, ARRAY },
};
static MfgPrmDblValue dbl_params[] =
{
{ "CUT_FEED", 200.0 }, /* required for manual cycle */
{ "SPINDLE_SPEED", 15000.0 } /* required for manual cycle */
};
n_dbl_params = sizeof( dbl_params ) / sizeof( MfgPrmDblValue );
size = sizeof( seq_elem_table ) / sizeof( ElemTable );
/*********************************************/
/* Allocate element tree */
/*********************************************/
err = ProElementAlloc( PRO_E_FEATURE_TREE, &seq_elem_tree );
ERROR_CHECK( "UserManualCycleCreate", "ProElementAlloc()", err );
/************************************************/
/* Init elem tree with common sequence elements */
/************************************************/
err = UserNcSeqTreeCommonElementsAdd( mfg_model,
PRO_FEAT_MILL,
PRO_NCSEQ_MANUAL_CYCLE_MILL,
feat_name,
operation,
retract_plane,
seq_csys,
head_num,
pocket_num,
tool_name,
dbl_params,
n_dbl_params,
NULL,
0,
seq_elem_tree );
ERROR_CHECK( "UserManualCycleCreate()", "UserNcSeqTreeCommonElementsAdd",
err );
/***************************************************/
/* Add elements specific for manual cycle sequence */
/***************************************************/
for ( ii = 0 ; ii < size; ii++ )
{
err = ProElementAlloc( seq_elem_table[ii].elem_type, &element );
ERROR_CHECK( "UserManualCycleCreate","ProElementAlloc()", err );
switch ( seq_elem_table[ii].elem_type )
{
case PRO_E_TOOL_MTN_ARR:
err = UserManualCycleMtnArrSet( element );
ERROR_CHECK( "UserManualCycleCreate",
"UserManualCycleMtnArrSet()", err );
break;
default:
ProTKFprintf( stderr, "Error setting element type\n" );
err = PRO_TK_GENERAL_ERROR;
ERROR_CHECK( "UserManualCycleCreate","UserManualCycleCreate()", err );
break;
}
err = ProElemtreeElementAdd( seq_elem_tree, NULL, element );
ERROR_CHECK( "UserManualCycleCreate", "ProElemtreeElementAdd()", err );
}
/*********************************************/
/* Display element tree */
/*********************************************/
ProUtilElementtreePrint( seq_elem_tree, PRO_TEST_INFO_WINDOW, NULL );
/*********************************************/
/* Create feature */
/*********************************************/
err = UserMfgModelFeatureCreate( mfg_model, seq_elem_tree, &seq_feature );
ERROR_CHECK( "UserManualCycleCreate", "UserMfgModelFeatureCreate()", err );
err = ProElementFree( &seq_elem_tree );
ERROR_CHECK( "UserManualCycleCreate", "ProElementFree()", err );
return ( (int)err );
}
/*====================================================================*\
FUNCTION : UserNcsequenceCreate
PURPOSE : Top level nc-sequence creation function
\*====================================================================*/
int UserNcsequenceCreate ()
{
ProMdl mfg_model;
ProError err = PRO_TK_NO_ERROR;
ProAssembly assembly;
ProSelection workcell;
int num_sels;
NcseqEnts entities;
ProLine tool_name;
ProMfgToolHeadType head_num = PRO_MFG_TOOL_HEAD_1;
ProSelection *axes;
ProSelection curve;
ProSelection seq_sel;
ProFeature rough_seq;
int pocket_num = 1;
int n_params;
static MfgPrmDblValue end_mill_60x40_params[] =
{
{ "CUTTER_DIAM", 60.0 },
{ "LENGTH", 40.0 }
};
static MfgPrmDblValue drill_8mm_params[] =
{
{ "CUTTER_DIAM", 8.0 },
{ "LENGTH", 75.0 },
{ "POINT_ANGLE", 118.0 }
};
static MfgPrmDblValue end_mill_60x180_params[] =
{
{ "CUTTER_DIAM", 60.0 },
{ "LENGTH", 180.0 }
};
static MfgPrmDblValue end_mill_18x100_params[] =
{
{ "CUTTER_DIAM", 18.0 },
{ "LENGTH", 100.0 }
};
static MfgPrmDblValue end_mill_20x40_params[] =
{
{ "CUTTER_DIAM", 20.0 },
{ "LENGTH", 40.0 }
};
static MfgPrmDblValue csink_15mm_params[] =
{
{ "CUTTER_DIAM", 15.0 },
{ "POINT_ANGLE", 90.0 },
{ "LENGTH", 50.0 },
};
err = ProMdlCurrentGet( &mfg_model );
ERROR_CHECK( "UserNcsequenceCreate", "ProMdlCurrentGet", err );
err = ProMfgAssemGet( (ProMfg)mfg_model, &assembly );
ERROR_CHECK( "UserNcsequenceCreate", "ProMfgAssemGet", err );
/*--------------------------------------------------------------------*\
Search required references
\*--------------------------------------------------------------------*/
entities.oper_found = PRO_B_FALSE;
entities.csys_found = PRO_B_FALSE;
entities.retract_found = PRO_B_FALSE;
entities.face_mill_wind_found = PRO_B_FALSE;
entities.pocket_mill_wind_found = PRO_B_FALSE;
entities.prof_mill_surf_found = PRO_B_FALSE;
entities.traj_curve_found = PRO_B_FALSE;
entities.model = (ProMfg)mfg_model;
err = ProSolidFeatVisit( assembly, UserNcseqEntitiesCollect, NULL,
(ProAppData) &entities );
/*--------------------------------------------------------------------*\
Create features
\*--------------------------------------------------------------------*/
if ( entities.oper_found &&
entities.retract_found &&
entities.csys_found &&
entities.traj_curve &&
entities.face_mill_wind_found &&
entities.prof_mill_surf_found &&
entities.pocket_mill_wind_found )
{
err = UserOperWorkcellGet( entities.operation, &workcell );
ERROR_CHECK( "UserNcsequenceCreate", "UserOperWorkcellGet", err );
/*------------------------------------------------------------------*\
Facing sequence
\*------------------------------------------------------------------*/
ProStringToWstring( tool_name, "FLAT_MILL_60MM" );
n_params = sizeof( end_mill_60x40_params )/sizeof( MfgPrmDblValue );
err = UserWorkcellToolAdd( mfg_model, workcell, head_num,
PRO_TOOL_END_MILL, tool_name,
end_mill_60x40_params, n_params,
PRO_UNITLENGTH_MM, PRO_B_TRUE, &pocket_num );
ERROR_CHECK( "UserNcsequenceCreate", "UserWorkcellToolAdd", err );
err = UserFacingCreate( (ProMfg)mfg_model,
L"FACING_W_D60_CUTTER",
entities.operation,
entities.retract_plane,
entities.csys,
entities.face_mill_window,
head_num,
pocket_num,
tool_name );
ERROR_CHECK( "UserNcsequenceCreate", "UserFacingCreate", err );
/*------------------------------------------------------------------*\
Countersink sequence
\*------------------------------------------------------------------*/
ProStringToWstring( tool_name, "CSINK_15MM" );
n_params = sizeof( csink_15mm_params )/sizeof( MfgPrmDblValue );
err = UserWorkcellToolAdd( mfg_model, workcell, head_num,
PRO_TOOL_CSINK, tool_name,
csink_15mm_params, n_params, PRO_UNITLENGTH_MM,
PRO_B_TRUE, &pocket_num );
ERROR_CHECK( "UserNcsequenceCreate", "UserWorkcellToolAdd", err );
err = UserCSinkgCreate( (ProMfg)mfg_model,
L"COUNTERSINK_D9",
entities.operation,
entities.retract_plane,
entities.csys,
9.,
head_num,
pocket_num,
tool_name );
ERROR_CHECK( "UserNcsequenceCreate", "UserCSinkgCreate", err );
/*------------------------------------------------------------------*\
Drilling sequence
\*------------------------------------------------------------------*/
ProStringToWstring( tool_name, "DRILL_8MM" );
n_params = sizeof( drill_8mm_params )/sizeof( MfgPrmDblValue );
err = UserWorkcellToolAdd( mfg_model, workcell, head_num,
PRO_TOOL_DRILL, tool_name,
drill_8mm_params, n_params, PRO_UNITLENGTH_MM,
PRO_B_TRUE, &pocket_num );
ERROR_CHECK( "UserNcsequenceCreate", "UserWorkcellToolAdd", err );
err = UserCollectAxesToDrill( assembly, &axes );
ERROR_CHECK( "UserNcsequenceCreate", "UserCollectAxesToDrill", err );
err = UserDrillingCreate( (ProMfg)mfg_model,
L"DRILLING_W_D8_DRILL",
entities.operation,
entities.retract_plane,
entities.csys,
axes,
head_num,
pocket_num,
tool_name );
ERROR_CHECK( "UserNcsequenceCreate", "UserDrillingCreate", err );
/*------------------------------------------------------------------*\
Trajectory sequence (tool motion based trajectory)
\*------------------------------------------------------------------*/
ProStringToWstring( tool_name, "END_MILL_65MM" );
n_params = sizeof( end_mill_60x180_params )/sizeof( MfgPrmDblValue );
err = UserWorkcellToolAdd( mfg_model, workcell, head_num,
PRO_TOOL_END_MILL, tool_name,
end_mill_60x180_params, n_params,
PRO_UNITLENGTH_MM, PRO_B_TRUE, &pocket_num );
ERROR_CHECK( "UserNcsequenceCreate", "UserWorkcellToolAdd", err );
err = UserTrajectoryCreate( (ProMfg)mfg_model,
L"TRAJECTORY_W_D60_MILL",
entities.operation,
entities.retract_plane,
entities.csys,
entities.traj_curve,
head_num,
pocket_num,
tool_name );
ERROR_CHECK( "UserNcsequenceCreate", "UserTrajectoryCreate", err );
/*------------------------------------------------------------------*\
2-axis trajectory sequence (curve trajectory)
\*------------------------------------------------------------------*/
err = UserCurveTrajCreate( (ProMfg)mfg_model,
L"CURVE_TRAJECTORY_W_D60_MILL",
entities.operation,
entities.retract_plane,
entities.csys,
entities.traj_curve,
head_num,
pocket_num,
tool_name );
ERROR_CHECK( "UserNcsequenceCreate", "UserTrajectoryCreate", err );
/*------------------------------------------------------------------*\
Roughing sequence
\*------------------------------------------------------------------*/
err = UserRoughingCreate( (ProMfg)mfg_model,
L"ROUGHING_W_D60_MILL",
entities.operation,
entities.retract_plane,
entities.csys,
entities.pocket_mill_window,
head_num,
pocket_num,
tool_name,
&rough_seq );
ERROR_CHECK( "UserNcsequenceCreate", "UserRoughingCreate", err );
/*------------------------------------------------------------------*\
Re-Roughing sequence
\*------------------------------------------------------------------*/
err = ProSelectionAlloc( NULL, &rough_seq, &seq_sel );
ERROR_CHECK( "UserNcseqEntitiesCollect", "ProSelectionAlloc()", err );
ProStringToWstring( tool_name, "END_MILL_20MM" );
n_params = sizeof( end_mill_20x40_params )/sizeof( MfgPrmDblValue );
err = UserWorkcellToolAdd( mfg_model, workcell, head_num,
PRO_TOOL_END_MILL, tool_name,
end_mill_20x40_params, n_params,
PRO_UNITLENGTH_MM, PRO_B_TRUE, &pocket_num );
ERROR_CHECK( "UserNcsequenceCreate", "UserWorkcellToolAdd", err );
err = UserReRoughingCreate( (ProMfg)mfg_model,
L"RE-ROUGHING_W_D20_MILL",
entities.operation,
entities.retract_plane,
entities.csys,
seq_sel,
head_num,
pocket_num,
tool_name );
ERROR_CHECK( "UserNcsequenceCreate", "UserReRoughingCreate", err );
/*------------------------------------------------------------------*\
Finishing sequence
\*------------------------------------------------------------------*/
err = UserFinishingCreate( (ProMfg)mfg_model,
L"FINISHING_W_D20_MILL",
entities.operation,
entities.retract_plane,
entities.csys,
entities.pocket_mill_window,
head_num,
pocket_num,
tool_name );
ERROR_CHECK( "UserNcsequenceCreate", "UserFinishingCreate", err );
/*------------------------------------------------------------------*\
Profile milling sequence
\*------------------------------------------------------------------*/
ProStringToWstring( tool_name, "END_MILL_18MM" );
n_params = sizeof( end_mill_18x100_params )/sizeof( MfgPrmDblValue );
err = UserWorkcellToolAdd( mfg_model, workcell, head_num,
PRO_TOOL_END_MILL, tool_name,
end_mill_18x100_params, n_params,
PRO_UNITLENGTH_MM, PRO_B_TRUE, &pocket_num );
ERROR_CHECK( "UserNcsequenceCreate", "UserWorkcellToolAdd", err );
err = UserProfilingCreate( (ProMfg)mfg_model,
L"PROFILING_W_D18_MILL",
entities.operation,
entities.retract_plane,
entities.csys,
entities.prof_mill_surf,
head_num,
pocket_num,
tool_name,
&rough_seq );
ERROR_CHECK( "UserNcsequenceCreate", "UserProfilingCreate", err );
/*------------------------------------------------------------------*\
Manual cycle sequence
\*------------------------------------------------------------------*/
err = UserManualCycleCreate( (ProMfg)mfg_model,
L"MANUAL_CYCLE_W_NO_TOOL",
entities.operation,
entities.retract_plane,
entities.csys,
head_num,
-1,
NULL );
ERROR_CHECK( "UserNcsequenceCreate", "UserManualCycleCreate", err );
}
else
{
if ( !entities.retract_found )
ProTKFprintf( stderr, "A suitable retract plane was not found\n" );
if ( !entities.oper_found )
ProTKFprintf( stderr, "A suitable operation was not found\n" );
if ( !entities.csys_found )
ProTKFprintf( stderr, "A suitable csys was not found\n" );
if ( !entities.face_mill_wind_found )
ProTKFprintf( stderr, "A suitable mill window was not found\n" );
if ( !entities.pocket_mill_wind_found )
ProTKFprintf( stderr, "A suitable mill window was not found\n" );
if ( !entities.prof_mill_surf_found )
ProTKFprintf( stderr, "A suitable mill surface was not found\n" );
}
return ((int)err);
}