When you click the Update Speed and Feed options in the Tools menu in the Manufacturing Process Table, the function PTMfgProctableItemFeedSpeed is invoked. This sample code enables you to change the cut feed and the spindle speed for the specified tool.
/*====================================================================*\
FUNCTION : PTMfgProctableItemFeedSpeed()
PURPOSE : Execute Feed/Speed
\*====================================================================*/
ProError PTMfgProctableItemFeedSpeed (ProMfg mfg, char* button_name
, ProAppData appdata)
{
ProAssembly r_solid_obj;
ProMdl mfg_mdl_under_test;
ProElempath epath;
ProElement params_element;
ProElempathItem p_items[3];
ProElemId elem_id;
ProValueDataType value_type = -1;
ProValue value = (ProValue)NULL;
ProValueData value_data;
status =ProMdlCurrentGet(&mfg_mdl_under_test);
PT_TEST_LOG_SUCC("ProMdlCurrentGet");
status = PTMfgProcitemElemtreeGet(&complete_tree);
PT_TEST_LOG_SUCC("PTMfgProcitemElemtreeGet");
if (status == PRO_TK_NO_ERROR)
PTMfgProcitemToolNameGet(complete_tree);
if (status == PRO_TK_NO_ERROR)
{
status = ProElempathAlloc(&epath);
PT_TEST_LOG_SUCC ("ProElempathAlloc ()");
p_items[0].type = PRO_ELEM_PATH_ITEM_TYPE_ID;
p_items[0].path_item.elem_id = PRO_E_MFG_PARAMS ;
status = ProElempathDataSet(epath, p_items, 1);
PT_TEST_LOG_SUCC ("ProElempathDataSet()");
status= ProElemtreeElementGet(complete_tree, epath,
¶ms_element);
PT_TEST_LOG_SUCC ("ProElemtreeElementGet()");
if ( status == PRO_TK_NO_ERROR )
{
status = ProElemtreeElementVisit( params_element,NULL,
( ProElemtreeVisitFilter) NULL,
( ProElemtreeVisitAction)
PTMfgElemtreeWalkthroughAction,
NULL );
PT_TEST_LOG_SUCC (" ProElemtreeElementVisit ");
}
ProElempathFree(&epath); }
status = ProMfgAssemGet(mfg_mdl_under_test,&r_solid_obj);
PT_TEST_LOG_SUCC ("ProMfgAssemGet");
status = ProSolidFeatVisit ((ProSolid)r_solid_obj,
(ProFeatureVisitAction)PTMfgMaterialGet,
NULL,
NULL);
PT_TEST_LOG_SUCC ("ProSolidFeatureVisit()");
status = PTMfgDialogCreate(params_element);
PTUtilInitCounters();
return PRO_TK_NO_ERROR;
}
The section below describes the action functions for the each of the preceding sample code.
/***********************ACTION FUNCTIONS*************************/
/*--------------------------------------------------------*\
FUNCTION : PTMfgElemtreeWalkthroughAction()
PURPOSE : Action function for PTUtilElemtreeWalkthroug
\*--------------------------------------------------------*/
ProError PTMfgElemtreeWalkthroughAction ( ProElement params_element,
ProElement element, ProElempath elem_path,
ProAppData app_data )
{ ProElempathItem p_items[3];
ProValueDataType value_type = -1;
ProElemId elem_id,p_elem_id; char * actual_value;
ProValue value = (ProValue)NULL;
ProValueData value_data; Data_Input *my_data;
ProElempath epath; my_data = (Data_Input*) app_data;
status = ProElementIdGet( element, &elem_id);
PT_TEST_LOG_SUCC("ProElementIdGet");
if ( elem_id == PRO_E_MFG_PARAM_NAME )
{ status = ProElementValuetypeGet ( element, &value_type );
PT_TEST_LOG(" ProElementValuetypeGet ", status,
status != PRO_TK_NO_ERROR && status != PRO_TK_INVALID_TYPE &&
status != PRO_TK_EMPTY );
if(value_type ==PRO_VALUE_TYPE_STRING)
{ status = ProElementStringGet( element,( ProElementStringOptions)
NULL,
&actual_value);
PT_TEST_LOG_SUCC (" ProElementStringGet ");
if ( (strcmp ( "CUT_FEED",actual_value) == 0)
||( strcmp ( "SPINDLE_SPEED",actual_value) == 0))
{
status = ProElempathAlloc(&epath);
PT_TEST_LOG_SUCC ("ProElempathAlloc ()");
p_items[0].type = PRO_ELEM_PATH_ITEM_TYPE_INDEX;
p_items[0].path_item.elem_index = count;
p_items[1].type = PRO_ELEM_PATH_ITEM_TYPE_ID;
p_items[1].path_item.elem_id = PRO_E_MFG_PARAMVAL;
status = ProElempathDataSet(epath, p_items, 2);
PT_TEST_LOG_SUCC ("ProElempathDataSet()");
status= ProElemtreeElementGet(params_element, epath, &p_element);
PT_TEST_LOG_SUCC ("ProElemtreeElementGet()");
status = ProElementIdGet( p_element, &p_elem_id);
PT_TEST_LOG_SUCC (" ProElementIdGet ");
if (p_elem_id ==PRO_E_MFG_PARAMVAL)
{
status = ProElementValueGet ( p_element, &value);
PT_TEST_LOG_SUCC("ProElementValueGet");
status = ProValueDataGet (value, &value_data);
PT_TEST_LOG("ProValueDataGet()", status,
(status != PRO_TK_NO_ERROR));
if (strcmp ( "CUT_FEED",actual_value) == 0)
{ cut_feed = value_data.v.d;
if (FLAG == 1)
{ value_data.v.d = my_data-cut_feed;
status = ProValueDataSet (value, &value_data);
PT_TEST_LOG("ProValueDataSet()", status,
(status != PRO_TK_NO_ERROR));
status = ProElementValueSet ( p_element, value);
PT_TEST_LOG_SUCC("ProElementValueGet");
}
}
if (strcmp ( "SPINDLE_SPEED",actual_value) == 0)
{ spindle_speed = value_data.v.d;
if (FLAG == 1)
{ value_data.v.d = my_data-spindle_speed;
status = ProValueDataSet (value, &value_data);
PT_TEST_LOG("ProValueDataSet()", status,
(status != PRO_TK_NO_ERROR));
status = ProElementValueSet
(p_element, value);
PT_TEST_LOG_SUCC("ProElementValueGet");
}
} count++;
}
ProElempathFree(&epath);
}
}
status = ProMfgproctableDisplayUpdate ();
PT_TEST_LOG_SUCC ("ProMfgproctableDisplayUpdate");
}
return PRO_TK_NO_ERROR;
}
/*--------------------------------------------------------*\
FUNCTION : PTMfgUsrUpdateAction
PURPOSE : Action function for the File Selection
\*--------------------------------------------------------*/
void PTMfgUsrUpdateAction(char *dialog, char *component, ProAppData data)
{ ProElement params_element;
ProCharName str; ProCharName str2;
double cut_feed_value; double spindle_speed_value;
Data_Input data1; wchar_t* wstr;
wchar_t* wstr2; ProErrorlist p_errors;
params_element = (ProElement) data;
ProUIInputpanelValueGet(DIALOG_NAME,"cut_feed",&wstr);
ProWstringToString(str, wstr);
cut_feed_value= atof(str);
ProUIInputpanelValueGet(DIALOG_NAME,"spindle_speed",&wstr2);
ProWstringToString(str2, wstr2);
spindle_speed_value= atof(str2);
data1.cut_feed = cut_feed_value;
data1.spindle_speed = spindle_speed_value;
count =0; FLAG =1;
status = ProElemtreeWrite
(params_element, PRO_ELEMTREE_XML, L"before_redef.inf");
PT_TEST_LOG_SUCC (" ProElemtreeWrite ");
status = ProElemtreeElementVisit( params_element, ( ProElempath )NULL ,
( ProElemtreeVisitFilter) NULL,
( ProElemtreeVisitAction) PTMfgElemtreeWalkthroughAction,
(ProAppData)&data1 );
PT_TEST_LOG_SUCC (" ProElemtreeElementVisit ");
status = ProMfgprocitemRedefine (sel_items,complete_tree,&p_errors);
PT_TEST_LOG_SUCC ("ProMfgprocitemRedefine");
status = ProMfgproctableDisplayUpdate ();
PT_TEST_LOG_SUCC ("ProMfgproctableDisplayUpdate");
PTUtilInitCounters();
status = ProUIDialogExit(DIALOG_NAME, 0);
PT_TEST_LOG_SUCC("ProUIDialogExit");
}
/*--------------------------------------------------------*\
FUNCTION : PTMfgUsrCancelAction
PURPOSE : Action function for the Directory Selection
\*--------------------------------------------------------*/
void PTMfgUsrCancelAction(char *dialog, char *component, ProAppData data)
{ ProError status;
PTUtilInitCounters();
status = ProUIDialogExit(DIALOG_NAME, 0);
PT_TEST_LOG_SUCC("ProUIDialogExit");
}
/*--------------------------------------------------------*\
FUNCTION : PTMfgElemtreePreReqAction()
PURPOSE : Get the material
\*--------------------------------------------------------*/
ProError PTMfgMaterialGet (ProFeature* feat, ProAppData data)
{ ProAsmcompType f_type;
ProMaterial p_material; ProFeattype feat_type;
ProSolid part; ProMdl p_mdl_handle;
ProCharName c_name; ProMdl mfg_mdl_under_test;
status =ProMdlCurrentGet(&mfg_mdl_under_test);
PT_TEST_LOG_SUCC("ProMdlCurrentGet");
status = ProFeatureTypeGet(feat,&feat_type);
PT_TEST_LOG_SUCC("ProFeatureTypeGet");
if(feat_type==PRO_FEAT_COMPONENT)
{ status = ProAsmcompTypeGet ((ProAsmcomp*)feat,feat-owner, &f_type);
PT_TEST_LOG_SUCC("ProAsmcompTypeGet");
if ( f_type == PRO_ASM_COMP_TYPE_REF_MODEL)
{ status = ProAsmcompMdlGet ((ProAsmcomp*)feat,&p_mdl_handle);
PT_TEST_LOG_SUCC("ProAsmcompMdlGet");
status = ProMaterialCurrentGet
((ProSolid)p_mdl_handle,&p_material);
PT_TEST_LOG_SUCC("ProMaterialCurrentGet");
ProWstringToString (c_name, p_material.matl_name);
ProWstringCopy(p_material.matl_name,material_name,
PRO_VALUE_UNUSED);
}
}
return PRO_TK_NO_ERROR;}
/*--------------------------------------------------------*\
FUNCTION : PTMfgElemtreePreReqAction()
PURPOSE : Action function for PTUtilElemtreeWalkthroug
\*--------------------------------------------------------*/
ProError PTMfgElemtreePreReqAction ( ProElement elem_tree,
ProElement element, ProElempath elem_path,
ProAppData app_data )
{ ProElemId elem_id;
ProValueData value_data; int ii, counter = 0;
ProValue *values = (ProValue *)NULL;
ProMfgprocItem *item_array; ProMfgprocItem item;
ProAssembly r_solid_obj; ProElement elem_tree_p;
ProMdl mfg_mdl_under_test;
status =ProMdlCurrentGet(&mfg_mdl_under_test);
PT_TEST_LOG_SUCC("ProMdlCurrentGet");
status = ProMfgAssemGet(mfg_mdl_under_test,&r_solid_obj);
PT_TEST_LOG_SUCC ("ProMfgAssemGet");
status = ProElementIdGet( element, &elem_id);
PT_TEST_LOG_SUCC("ProElementIdGet");
if (elem_id == PRO_E_NCSEQ_PREREQUISITE_ARR)
{ status = ProArrayAlloc( 0, sizeof(ProValue), 1,
(ProArray *)&values );
PT_TEST_LOG_SUCC("ProArrayAlloc");
status = ProArrayAlloc( 0, sizeof(ProMfgprocItem), 1,
(ProArray *)&item_array );
PT_TEST_LOG_SUCC("ProArrayAlloc(");
status = ProElementValuesGet(element, &values );
PT_TEST_LOG_SUCC("ProArrayAlloc");
if( status == PRO_TK_NO_ERROR )
status = ProArraySizeGet( (ProArray)values, &counter );
for( ii = 0; ii < counter; ii++ )
{
if( ( ProValueDataGet( values[ii], &value_data ) == PRO_TK_NO_ERROR )
&& ( value_data.type == PRO_VALUE_TYPE_INT ) )
{ item.type = PRO_NC_STEP_OBJECT;
item.id = value_data.v.i;
item.owner = r_solid_obj; }
status = ProArrayObjectAdd((ProArray*)&item_array,-1,1,&item);
PT_TEST_LOG_SUCC("ProArrayObjectAdd");
}
status = ProMfgproctableSelecteditemsSet
(PRO_MFGPROCTABLE_PROCESS,item_array);
PT_TEST_LOG_SUCC ("ProMfgproctableSelecteditemsSet");
status = ProMfgproctableDisplayUpdate ();
PT_TEST_LOG_SUCC ("ProMfgproctableDisplayUpdate");
ProArrayFree ( (ProArray *)&values );
ProArrayFree ( (ProArray *)&item_array );
} return PRO_TK_NO_ERROR;
}/*--------------------------------------------------------*\
FUNCTION : PTMfgDialogCreate
PURPOSE : Creates the dialog
\*--------------------------------------------------------*/
ProError PTMfgDialogCreate(ProElement params_element)
{ int choice;
ProCharName str; ProName wstr;
status = ProUIDialogCreate(DIALOG_NAME,DIALOG_NAME);
PT_TEST_LOG_SUCC("ProUIPTMfgDialogCreate");
status = ProUIDialogWidthSet(DIALOG_NAME,300);
PT_TEST_LOG_SUCC("ProUIPTMfgDialogCreate");
status = ProUIDialogHeightSet(DIALOG_NAME,160);
PT_TEST_LOG_SUCC("ProUIPTMfgDialogCreate");
status = ProUIDialogTitleSet (DIALOG_NAME,L"Feed/Speed database access");
PT_TEST_LOG_SUCC ("ProUIDialogTitleSet()");
status = ProUILabelTextSet (DIALOG_NAME, "tool_id_val", tool_id);
PT_TEST_LOG_SUCC ("ProUILabelTextSet()");
status = ProUILabelTextSet (DIALOG_NAME, "material_val", material_name);
PT_TEST_LOG_SUCC ("ProUILabelTextSet()");
sprintf(str,"%f",cut_feed); ProStringToWstring(wstr, str);
ProUIInputpanelValueSet(DIALOG_NAME,"cut_feed",wstr);
PT_TEST_LOG_SUCC("ProUIInputpanelValueSet");
sprintf(str,"%f",spindle_speed);
ProStringToWstring(wstr, str);
ProUIInputpanelValueSet(DIALOG_NAME,"spindle_speed",wstr);
PT_TEST_LOG_SUCC("ProUIInputpanelValueSet");
status = ProUIPushbuttonActivateActionSet
(DIALOG_NAME, UPDATE, PTMfgUsrUpdateAction, params_element);
PT_TEST_LOG_SUCC("ProUIPushbuttonActivateActionSet");
status = ProUIPushbuttonActivateActionSet
(DIALOG_NAME, CANCEL, PTMfgUsrCancelAction, NULL);
PT_TEST_LOG_SUCC("ProUIPushbuttonActivateActionSet");
status = ProUIDialogActivate(DIALOG_NAME, &choice);
PT_TEST_LOG_SUCC("ProUIDialogActivate");
status = ProUIDialogDestroy(DIALOG_NAME);
PT_TEST_LOG_SUCC("ProUIDialogDestroy");
}
/*--------------------------------------------------------*\
FUNCTION : PTMfgProcitemElemtreeGet
PURPOSE : Gets the elem tree of selected item
\*--------------------------------------------------------*/
ProError PTMfgProcitemElemtreeGet(ProElement *elem_tree)
{ status = ProMfgproctableSelecteditemsGet
(PRO_MFGPROCTABLE_PROCESS,&sel_items);
PT_TEST_LOG_SUCC ("ProMfgproctableSelecteditemsGet");
/*TBD : Currently one one ( fitst item is checked here...
To be updated with multiple selections of items in ui ..*/
status = ProMfgprocitemElemtreeGet (&sel_items[0], elem_tree);
PT_TEST_LOG_SUCC("ProMfgprocitsmElemtreeGet");
return status;
}
/*--------------------------------------------------------*\
FUNCTION : PTTestMfgProcItemVisit
PURPOSE : Action function for ProMfgProctableVisit
\*--------------------------------------------------------*/
ProError PTTestMfgProcItemVisit
( ProMfgprocItem* item, ProError error,
ProAppData app_data)
{ ProAnnotation annotation;
ProMfgstepHolesetEndType end_type;
ProDrillDepthType depth_type;
status = ProMfgprocitemAnnotationGet (item, &annotation);
PT_TEST_LOG_SUCC ("ProMfgprocitemAnnotationGet");
if ( status == PRO_TK_NO_ERROR)
{ status = ProParameterVisit (&annotation,NULL,
PTMfgParameterVisit,"HOLE_ADJUST");
PT_TEST_LOG_SUCC("ProParameterVisit");
} if ( found == PRO_B_TRUE)
{
status = ProParameterVisit (&annotation,NULL,PTMfgParameterVisit,
"HOLE_DEP_1");
PT_TEST_LOG_SUCC("ProParameterVisit");
status = ProParameterVisit (&annotation,NULL,PTMfgParameterVisit,
"HOLE_DEP_2");
PT_TEST_LOG_SUCC("ProParameterVisit");
}
status = ProMfgprocitemHolesetdepthtypeGet (item,&depth_type,&end_type);
PT_TEST_LOG_SUCC("ProMfgprocitemHolesetdepthtypeGet");
if ((end_type == PRO_MFGSTEP_HOLESETEND_ALONG_AXIS) &&
(depth_type ==PRO_DRILL_BLIND))
{
status = ProMfgprocitemHolesetdepthSet (item ,hole_dep_1);
PT_TEST_LOG_SUCC ("ProMfgprocitemHolesetdepthSet");
} if (end_type ==PRO_MFGSTEP_HOLESETEND_REFERENCE)
{ status = ProMfgprocitemHolesetdepthSet (item ,hole_dep_2);
PT_TEST_LOG_SUCC ("ProMfgprocitemHolesetdepthSet");
}
return PRO_TK_NO_ERROR;
}/*--------------------------------------------------------*\
FUNCTION : PTMfgParameterVisit
PURPOSE : Visit the param.
\*--------------------------------------------------------*/
ProError PTMfgParameterVisit(ProParameter* param, ProError status,
ProAppData data)
{ ProCharName str;
ProParamvalue value; ProParamvalueType type;
short l_val;
ProWstringToString(str,param-id);
if ( strcmp (str, data) == 0)
{ status = ProParameterValueGet (param, &value);
PT_TEST_LOG_SUCC ("ProParameterValueGet()");
status = ProParamvalueTypeGet (&value, &type);
PT_TEST_LOG_SUCC ("ProParamvalueTypeGet()");
if (type == PRO_PARAM_BOOLEAN)
{ status = ProParamvalueValueGet (&value, type, (void *) &l_val);
PT_TEST_LOG_SUCC ("ProParamvalueValueGet()");
if (l_val == 1)
found = PRO_B_TRUE;
}
if (type == PRO_PARAM_DOUBLE) {
if ( strcmp (str,"HOLE_DEP_1") == 0)
{ status = ProParamvalueValueGet
(&value, type, (void *) &hole_dep_1);
PT_TEST_LOG_SUCC ("ProParamvalueValueGet()");
}
if ( strcmp (str,"HOLE_DEP_2") == 0)
{ status = ProParamvalueValueGet
(&value, type, (void *) &hole_dep_2);
PT_TEST_LOG_SUCC ("ProParamvalueValueGet()");
}
} }
return PRO_TK_NO_ERROR;
}/*--------------------------------------------------------*\
FUNCTION : PTMfgProcitemToolNameGet
PURPOSE : Get the tool name from elem tree.
\*--------------------------------------------------------*/
ProError PTMfgProcitemToolNameGet(ProElement elem)
{ ProElempath epath;
ProElement tool_element; ProElempathItem p_items[3];
ProElemId elem_id; ProValueDataType value_type = -1;
ProValue value = (ProValue)NULL;
ProValueData value_data; char toolname[100];
status = ProElemtreeWrite (elem, PRO_ELEMTREE_XML, L"selecteditem_feed.inf");
PT_TEST_LOG_SUCC (" ProElemtreeWrite ");
status = ProElempathAlloc(&epath);
PT_TEST_LOG_SUCC ("ProElempathAlloc ()");
p_items[0].type = PRO_ELEM_PATH_ITEM_TYPE_ID;
p_items[0].path_item.elem_id = PRO_E_TOOL ;
status = ProElempathDataSet(epath, p_items, 1);
PT_TEST_LOG_SUCC ("ProElempathDataSet()");
status= ProElemtreeElementGet(complete_tree, epath, &tool_element);
PT_TEST_LOG_SUCC ("ProElemtreeElementGet()");
status = ProElementIdGet( tool_element, &elem_id);
PT_TEST_LOG_SUCC("ProElementIdGet");
if ( elem_id == PRO_E_TOOL ) {
status = ProElementValueGet (tool_element, &value);
PT_TEST_LOG_SUCC("ProElementValueGet");
status = ProValueDataGet (value, &value_data);
PT_TEST_LOG_SUCC("ProValueDataGet()");
if (value_data.v.w == NULL)
ProStringToWstring(tool_id,"TOOL_NOT_SET");
else ProWstringCopy(value_data.v.w,tool_id,PRO_VALUE_UNUSED);
} ProElempathFree(&epath);
return PRO_TK_NO_ERROR;}
/*====================================================================*\
FUNCTION : user_terminate()
PURPOSE : To handle any termination actions
\*====================================================================*/
void user_terminate(){
}