/*
Copyright (c) 2024 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved.
*/
/*--------------------------------------------------------------------*\
Pro/Toolkit includes
\*--------------------------------------------------------------------*/
#include <ProToolkit.h>
#include <ProFeature.h>
#include <ProAsmcomp.h>
#include <ProModelitem.h>
#include <ProSolid.h>
#include <ProMfg.h>
#include <ProMenu.h>
#include <ProUtil.h>
#include <ctype.h>
#include <TestMfgNew.h>
#include <UtilMfgNew.h>
#include <MfgMenu.h>
#include <TestError.h>
#include <UtilTree.h>
#include <UtilMenu.h>
#include <UtilString.h>
#include <UtilMessage.h>
#include <ProTKRunTime.h>
/*--------------------------------------------------------------------*\
Application macros
\*--------------------------------------------------------------------*/
/*--------------------------------------------------------------------*\
Application data types
\*--------------------------------------------------------------------*/
/*--------------------------------------------------------------------*\
Application global/external data
\*--------------------------------------------------------------------*/
#define TK_FIXT_CREATE 1 << 15
#define TK_FIXT_MODIFY 1 << 16
#define TK_FIXT_DELETE 1 << 17
#define TK_FIXT_ACTIVATE 1 << 18
ProError test_func(ProAppData, ProAppData, int);
/*====================================================================*\
FUNCTION : ProTestFixtureCreate
PURPOSE : Create Fixture feature
\*====================================================================*/
ProError ProTestFixtureCreate(MfgMenuChoice *obj_action)
{
ProElement fixt_elem_tree = (ProElement)NULL; /* Entire tree */
ProElement fixt_elem = (ProElement)NULL; /* One element */
ProError status = PRO_TK_NO_ERROR;
int feat_type = PRO_FEAT_FIXSETUP;
static char* menu[] = {"TkFixtSet","TkMfgDQ",""};
int menu_id, n_menus;
/*--------------------------------------------------------------------*\
Allocate space for workcell element tree
\*--------------------------------------------------------------------*/
if (status == PRO_TK_NO_ERROR)
{
status = ProElementAlloc ( PRO_E_FEATURE_TREE, &fixt_elem_tree );
TEST_CALL_REPORT("ProElementAlloc()", "ProTestFixtureCreate()",
status, (status != PRO_TK_NO_ERROR));
/*--------------------------------------------------------------------*\
Set feature type
\*--------------------------------------------------------------------*/
if (status == PRO_TK_NO_ERROR)
{
status = ProElementAlloc ( PRO_E_FEATURE_TYPE,
&fixt_elem );
TEST_CALL_REPORT("ProElementAlloc()", "ProTestFixtureCreate()",
status, (status != PRO_TK_NO_ERROR));
if (status == PRO_TK_NO_ERROR)
status = ProUtilElementBuild ( PRO_VALUE_TYPE_INT, &feat_type,
&fixt_elem);
if (status == PRO_TK_NO_ERROR)
status = ProElemtreeElementAdd(fixt_elem_tree, NULL, fixt_elem);
TEST_CALL_REPORT("ProElemtreeElementAdd()","ProTestFixtureCreate()",
status, (status != PRO_TK_NO_ERROR));
}
}
/*--------------------------------------------------------------------*\
Create the setup menu
\*--------------------------------------------------------------------*/
ProMenuFileRegister((char*)"TkFixtSet",(char*)"tkfixtset.mnu",&menu_id);
ProMenubuttonActionSet((char*)"TkFixtSet",(char*)"TkFixtSet",
(ProMenubuttonAction)ProUtilMenuKill, NULL,2);
ProMenubuttonActionSet((char*)"TkFixtSet",(char*)"-Name", (ProMenubuttonAction)ProTestFixtAction,
(ProAppData)&fixt_elem_tree,PRO_E_FEAT_NAME );
ProMenubuttonActionSet((char*)"TkFixtSet",(char*)"-Component", (ProMenubuttonAction)ProTestFixtAction,
(ProAppData)&fixt_elem_tree, PRO_E_COMPONENTS );
ProMenubuttonActionSet((char*)"TkFixtSet",(char*)"-Setup time", (ProMenubuttonAction)ProTestFixtAction,
(ProAppData)&fixt_elem_tree, PRO_E_SETUP_TIME );
ProMenuFileRegister((char*)"TkMfgDQ",(char*)"tkmfgdq.mnu", &menu_id );
ProMenubuttonActionSet((char*)"TkMfgDQ",(char*)"TkMfgDQ",
(ProMenubuttonAction) ProMenuDelete, NULL, 0);
ProMenubuttonActionSet((char*)"TkMfgDQ",(char*)"Done", (ProMenubuttonAction)ProTestFixtCreate,
(ProAppData) &fixt_elem_tree, 0 );
ProMenubuttonActionSet((char*)"TkMfgDQ",(char*)"Quit",(ProMenubuttonAction) ProUtilMenuKill,
NULL, 2 );
ProCompoundmenuCreate(menu, &n_menus);
return ((ProError)1);
}
/*====================================================================*\
FUNCTION : ProTestFixtCreate
PURPOSE : Create the fixture from the element tree
\*====================================================================*/
int ProTestFixtCreate (
ProAppData element_tree,
int dummy )
{
ProSelection selection;
ProFeature fixture;
ProErrorlist errors;
ProMfg mfg_model;
ProSolid mfg_solid;
ProAssembly mfg_asm;
ProAsmcomppath comp_path;
ProModelitem model_item;
ProError status;
int id;
ProFeatureCreateOptions *opts = 0;
if ( element_tree == NULL)
return PRO_TK_BAD_INPUTS;
(void) ProUtilElementtreePrint(*((ProElement*)element_tree),
PRO_TEST_INFO_WINDOW, NULL);
status = ProTestGetModels( &mfg_model, &mfg_solid, &comp_path);
if (status == PRO_TK_NO_ERROR)
{
status = ProMfgAssemGet( mfg_model, &mfg_asm );
TEST_CALL_REPORT("ProMfgAssemGet()", "ProTestFixtCreate()",
status, (status != PRO_TK_NO_ERROR));
}
if (status == PRO_TK_NO_ERROR)
{
status = ProMdlIdGet((ProMdl) mfg_asm, &id );
TEST_CALL_REPORT("ProMfgAssemGet()", "ProTestFixtCreate()",
status, (status != PRO_TK_NO_ERROR));
}
if (status == PRO_TK_NO_ERROR)
{
status = ProModelitemInit( mfg_asm, id, PRO_ASSEMBLY, &model_item );
TEST_CALL_REPORT("ProModelitemInit()","ProTestFixtCreate()",
status, (status != PRO_TK_NO_ERROR));
}
if ( status == PRO_TK_NO_ERROR)
{
status = ProSelectionAlloc(NULL, &model_item, &selection);
TEST_CALL_REPORT("ProSelectionAlloc()", "ProTestFixtCreate()",
status, (status != PRO_TK_NO_ERROR));
}
if (status == PRO_TK_NO_ERROR)
{
status = ProArrayAlloc(1,sizeof(ProFeatureCreateOptions),
1, (ProArray*)&opts);
opts[0]= PRO_FEAT_CR_NO_OPTS;
status = ProFeatureWithoptionsCreate( selection, *((ProElement*)element_tree),
opts, PRO_REGEN_NO_FLAGS, &fixture, &errors);
TEST_CALL_REPORT("ProFeatureWithoptionsCreate()", "ProTestFixtCreate()",
status, (status != PRO_TK_NO_ERROR));
status = ProArrayFree((ProArray*)&opts);
}
/*
status = ProElementFree(*((ProElement*)element_tree);
TEST_CALL_REPORT("ProElementFree()", "ProTestCreateWkcell()",
status, (status != PRO_TK_NO_ERROR));
*/
ProMenuDelete();
return(status);
}
/*====================================================================*\
FUNCTION : ProTestFixtAction
PURPOSE : Prompt user for a specified element and add it to tree.
\*====================================================================*/
int ProTestFixtAction ( ProAppData element, int element_id )
{
wchar_t wstr[PRO_LINE_SIZE];
char str[PRO_LINE_SIZE];
void *entry;
ProError status = PRO_TK_NO_ERROR;
ProElement elem = (ProElement)NULL;
int value_type, comp_id, c_range[2] = {0,9999};
double d_val, d_range[2] = {0.0, 9999.9};
status = ProElementAlloc( element_id, &elem );
if (status == PRO_TK_NO_ERROR)
{
switch ( element_id )
{
case PRO_E_FEAT_NAME:
ProTKSprintf(str,(char*)"Enter fixture name : ");
ProUtilMsgPrint((char*)"gen", (char*)"TEST %0s", str);
if (!ProUtilStringGet(wstr, NULL, PRO_LINE_SIZE))
{
status = PRO_TK_USER_ABORT;
}
else
{
value_type = PRO_VALUE_TYPE_WSTRING;
entry = wstr;
}
break;
case PRO_E_COMPONENTS:
ProTKSprintf(str,(char*)"Enter fixture component id : ");
ProUtilMsgPrint((char*)"gen", (char*)"TEST %0s", str);
if (!ProUtilIntGet(c_range, NULL, &comp_id))
{
status = PRO_TK_USER_ABORT;
}
else
{
value_type = PRO_VALUE_TYPE_INT;
entry = &comp_id;
}
break;
case PRO_E_SETUP_TIME:
ProTKSprintf(str,(char*)"Enter fixture setup time : ");
ProUtilMsgPrint((char*)"gen", (char*)"TEST %0s", str);
if (!ProUtilDoubleGet(d_range, NULL, &d_val))
{
status = PRO_TK_USER_ABORT;
}
else
{
value_type = PRO_VALUE_TYPE_DOUBLE;
entry = &d_val;
}
break;
default:
status = PRO_TK_BAD_INPUTS;
}
if (status == PRO_TK_NO_ERROR)
{
status = ProUtilElementBuild((ProValueDataType)value_type, entry, &elem);
if (status == PRO_TK_NO_ERROR)
{
status = ProElemtreeElementAdd(*(ProElement*)element, NULL,
elem);
TEST_CALL_REPORT("ProElemtreeElementAdd()",
"ProTestFixtAction()",
status, (status != PRO_TK_NO_ERROR));
}
}
}
return ((int)status);
}
ProError test_func(ProAppData p_fixt, ProAppData app_data, int ts)
{
ProTKFprintf(stderr, (char*)"In test_func()\n");
ProTKFprintf(stderr, (char*)"Fixture id = %d\n", ((ProFixture*)p_fixt)->id );
ProTKFprintf(stderr, (char*)"Test double = %f\n", *((double*)app_data));
ProTKFprintf(stderr, (char*)"Test int = %d\n", ts );
return PRO_TK_NO_ERROR;
}
/*====================================================================*\
FUNCTION : ProTestFixtList
PURPOSE :
\*====================================================================*/
int ProTestFixtList( MfgMenuChoice *obj_action )
{
ProError status;
double dval = 678.323;
int ival = 123;
status = ProUtilMfgobjAction ( obj_action, MFGOBJ_FIXTURE,
obj_action->mfgobj_list->n_fixture, test_func, &dval, ival );
return 0;
}
/*====================================================================*\
FUNCTION : ProTestFixtureDisp
PURPOSE :
\*====================================================================*/
ProError ProTestFixtureDisp(
MfgMenuChoice *obj_action)
{
int menu_id, action;
/*--------------------------------------------------------------------*\
Create the fixture menu
\*--------------------------------------------------------------------*/
ProMenuFileRegister((char*)"TkFixt", (char*)"tkfixt.mnu", &menu_id);
ProMenubuttonActionSet((char*)"TkFixt", (char*)"Activate",
(ProMenubuttonAction)ProTestFixtureActivate,
(ProAppData)obj_action, 0);
ProMenubuttonActionSet((char*)"TkFixt", (char*)"Deactivate All",
(ProMenubuttonAction)ProTestFixtDeactivate, NULL, 0);
ProMenubuttonActionSet((char*)"TkFixt", (char*)"Done",
(ProMenubuttonAction)ProMenuDelete, NULL, 0);
ProMenubuttonActionSet((char*)"TkFixt", (char*)"TkFixt",
(ProMenubuttonAction)ProMenuDelete, NULL, 0);
ProMenuCreate (PROMENUTYPE_MAIN, (char*)"TkFixt", &menu_id);
ProMenuProcess ((char*)"", &action);
return PRO_TK_NO_ERROR;
}
/*====================================================================*\
FUNCTION : ProTestFixtDeactivate
PURPOSE : Deactivate all fixtures
\*====================================================================*/
ProError ProTestFixtDeactivate()
{
ProError status = PRO_TK_NO_ERROR;
ProMfg mfg_model;
ProSolid mfg_solid;
ProAsmcomppath comp_path;
status = ProTestGetModels ( &mfg_model, &mfg_solid, &comp_path );
status = ProMfgFixtActivate ( mfg_model, NULL);
TEST_CALL_REPORT("ProMfgFixtActivate()", "ProTestFixtDeactivate",
status, status != PRO_TK_NO_ERROR );
return status;
}
/*====================================================================*\
FUNCTION : ProTestFixtureActivate
PURPOSE : general function to activate a fixture
\*====================================================================*/
ProError ProTestFixtureActivate (
MfgMenuChoice *obj_action)
{
ProError status;
double dval = 0;
int ival = 0;
status = ProUtilMfgobjAction ( obj_action, MFGOBJ_FIXTURE, 1,
ProTestFixtActivate, &dval, ival );
return status;
}
/*====================================================================*\
FUNCTION : ProTestFixtActivate
PURPOSE : Activate selected fixture
\*====================================================================*/
ProError ProTestFixtActivate (
ProAppData p_fixt,
ProAppData app_data,
int dummy)
{
ProError status = PRO_TK_NO_ERROR;
ProMfg mfg_model;
ProSolid mfg_solid;
ProAsmcomppath comp_path;
status = ProTestGetModels ( &mfg_model, &mfg_solid, &comp_path );
status = ProMfgFixtActivate( mfg_model, (ProFixture *) p_fixt);
TEST_CALL_REPORT("ProMfgFixtActivate", "ProTestFixtActivate",
status, status != PRO_TK_NO_ERROR);
return status;
}
/*====================================================================*\
FUNCTION : ProTestFixtureDelete
PURPOSE : general function to delete fixtures
\*====================================================================*/
ProError ProTestFixtureDelete(
MfgMenuChoice *obj_action )
{
ProError status;
double dval = 0;
int ival = 0;
status = ProUtilMfgobjAction(obj_action, MFGOBJ_FIXTURE,
obj_action->mfgobj_list->n_fixture, ProTestFixtDelete, &dval, ival );
return status;
}
/*====================================================================*\
FUNCTION : ProTestFixtDelete
PURPOSE : Delete selected fixture from the mfg model
\*====================================================================*/
ProError ProTestFixtDelete (
ProAppData p_fixt,
ProAppData app_data,
int dummy)
{
ProError status = PRO_TK_NO_ERROR;
ProMfg mfg_model;
ProSolid mfg_solid;
ProAsmcomppath comp_path;
ProFeatureDeleteOptions *delete_opts = 0;
int *feat_ids = NULL;
status = ProTestGetModels ( &mfg_model, &mfg_solid, &comp_path );
status = ProArrayAlloc(1,sizeof(ProFeatureDeleteOptions),
1, (ProArray*)&delete_opts);
delete_opts[0] = PRO_FEAT_DELETE_NO_OPTS;
status = ProArrayAlloc(1,sizeof(int),
1, (ProArray*)&feat_ids);
feat_ids[0] = ((ProFixture *)p_fixt)->id;
status = ProFeatureWithoptionsDelete ( mfg_solid, feat_ids, delete_opts,
PRO_REGEN_NO_FLAGS);
TEST_CALL_REPORT("ProFeatureWithoptionsDelete()", "ProTestFixturesDelete()",
status, status != PRO_TK_NO_ERROR );
status = ProArrayFree((ProArray*)&delete_opts);
status = ProArrayFree((ProArray*)&feat_ids);
return status;
}