/* Copyright (c) 2024 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved. */ /*--------------------------------------------------------------------*\ Pro/Toolkit includes \*--------------------------------------------------------------------*/ #include <ProToolkit.h> #include <ProElement.h> #include <ProFeature.h> #include <ProFeatType.h> #include <ProMenu.h> #include <ProModelitem.h> #include <ProNcseq.h> #include <ProNcseqElem.h> #include <ProClCmd.h> #include <ProClcmdElem.h> #include <ProSelection.h> #include <ProUtil.h> #include <ProTKRunTime.h> #include <PTApplsUnicodeUtils.h> /*--------------------------------------------------------------------*\ Application includes \*--------------------------------------------------------------------*/ #include "TestError.h" #include "TestConsts.h" #include "TestMfgNew.h" #include "UtilMessage.h" #include "UtilGroups.h" /*--------------------------------------------------------------------*\ Application types \*--------------------------------------------------------------------*/ typedef enum { TEST_NCL_CREATE = 0, TEST_NCL_REMOVE, TEST_NCL_REMOVE_BY_IDX, TEST_NCL_REDEFINE, TEST_NCL_REDEFINE_BY_IDX } TestNclActType ; typedef struct usr_elem_table{ int elem_type; int val_type; } UserElemTable; #define TEST_NCLC_CREATE 0 #define TEST_NCLC_RECREATE 1 #define TEST_NCLC_REDEFINE 2 /*--------------------------------------------------------------------*\ Function prototypes \*--------------------------------------------------------------------*/ ProError ProTestCmdsArrayFree (wchar_t*** cmds); ProError ProTestClcmdElemCreate( ProElement NclCmds) ; ProError ProTestClcmdElemRemove( ProElement elem_tree) ; ProError ProTestClcmdElemRemoveByIndex( ProElement elem_tree); ProError ProTestClcmdElemRedefineByIndex( ProElement elem_tree); ProError ProTestClcmdElemRedefine( ProElement elem_tree); int ProTestCustmzRecreate( void* p_dummy, int action ); int ProTestCustmzRedefine( void* p_dummy, int action ); int ProTestCustmzCreateMenuAct(void* p_dummy, int action ); /*====================================================================*\ FUNCTION : ProTestPrintErrs PURPOSE : print feature creation or redefinition errors \*====================================================================*/ ProError ProTestRootToNclcommElem ( ProElement tree_root, ProElement * NclcommsElem) { ProError err; ProElempath to_ncl_cmds; ProElempathItem path = { PRO_ELEM_PATH_ITEM_TYPE_ID, PRO_E_NCL_COMMANDS }; ProElemId id; err = ProElementIdGet (tree_root, &id); TEST_CALL_REPORT("ProElementIdGet()", "ProTestRootToNclcommElem()", err, err != PRO_TK_NO_ERROR ); if (id == PRO_E_NCL_COMMANDS) { *NclcommsElem = tree_root; return PRO_TK_NO_ERROR; } err = ProElempathAlloc ( &to_ncl_cmds); TEST_CALL_REPORT("ProElempathAlloc()", "ProTestRootToNclcommElem()", err, err != PRO_TK_NO_ERROR ); err = ProElempathDataSet ( to_ncl_cmds, &path, 1); TEST_CALL_REPORT("ProElempathDataSet()", "ProTestRootToNclcommElem()", err, err != PRO_TK_NO_ERROR ); err = ProElemtreeElementGet (tree_root, to_ncl_cmds, NclcommsElem); TEST_CALL_REPORT("ProElemtreeElementGet()", "ProTestRootToNclcommElem()", err, err != PRO_TK_NO_ERROR ); err = ProElementIdGet (*NclcommsElem, &id); TEST_CALL_REPORT("ProElementIdGet()", "ProTestRootToNclcommElem()", err, err != PRO_TK_NO_ERROR ); ProTKPrintf ((char*)"Id: %d\n", id); err = ProElempathFree ( &to_ncl_cmds); TEST_CALL_REPORT("ProElempathFree()", "ProTestRootToNclcommElem()", err, err != PRO_TK_NO_ERROR ); return (err); } /*====================================================================*\ FUNCTION : ProTestChooseNclAct PURPOSE : Select \*====================================================================*/ int ProTestChooseNclAct( ProElement custm_tree, int opt ) { ProError err; switch (opt) { case TEST_NCL_CREATE: err = ProTestClcmdElemCreate(custm_tree); break; case TEST_NCL_REMOVE: err = ProTestClcmdElemRemove(custm_tree); break; case TEST_NCL_REMOVE_BY_IDX: err = ProTestClcmdElemRemoveByIndex(custm_tree); break; case TEST_NCL_REDEFINE: err = ProTestClcmdElemRedefine(custm_tree); break; case TEST_NCL_REDEFINE_BY_IDX: err = ProTestClcmdElemRedefineByIndex(custm_tree); break; default: ProTKPrintf((char*)"error in data\n"); } return (0); } /*====================================================================*\ FUNCTION : ProTest PURPOSE : Select \*====================================================================*/ int ProTestTkClcmdsAct (ProAppData data, int dummy) { ProError err; int menu_id; int opt; err = ProMenuFileRegister( (char*)"TkCLcmds", (char*)"tkclcmds.mnu", &menu_id ); TEST_CALL_REPORT( "ProMenuFileRegister()", "ProTestAsmFunc()", err, err != PRO_TK_NO_ERROR ); ProMenubuttonActionSet( (char*)"TkCLcmds", (char*)"-Recreate", (ProMenubuttonAction)ProTestCustmzRecreate, (ProAppData)&opt , TEST_NCLC_RECREATE ); ProMenubuttonActionSet( (char*)"TkCLcmds", (char*)"-Redefine", (ProMenubuttonAction)ProTestCustmzRedefine, (ProAppData)&opt , TEST_NCLC_REDEFINE); ProMenubuttonActionSet( (char*)"TkCLcmds", (char*)"-Create", (ProMenubuttonAction)ProTestCustmzCreateMenuAct, (ProAppData)&opt , TEST_NCLC_REDEFINE); ProMenubuttonActionSet( (char*)"TkCLcmds", (char*)"TkCLcmds", (ProMenubuttonAction)ProMenuDelete, NULL , 0); ProMenubuttonActionSet( (char*)"TkCLcmds", (char*)"-Done", (ProMenubuttonAction)ProMenuDelete, NULL , 0); ProMenuCreate(PROMENUTYPE_MAIN, (char*)"TkCLcmds", NULL); ProMenuProcess((char*)"TkCLcmds", &menu_id); return 0; } /*====================================================================*\ FUNCTION : ProTestPrintErrs PURPOSE : print feature creation or redefinition errors \*====================================================================*/ ProError ProTestPrintErrs1( ProErrorlist err_list) { int i; char elem_name[PRO_LINE_SIZE]; char elem_str[PRO_LINE_SIZE + 10]; char err_str[50]; char title[30]; char text[100]; for (i=0; i<err_list.error_number; i++) { if (ProUtilIdToStr(err_list.error_list->err_item_id, elem_name) == PRO_TK_E_NOT_FOUND) ProTKSprintf(elem_str, (char*)"Elem: %d", err_list.error_list->err_item_id); else ProTKSprintf(elem_str, (char*)"Elem: %s", elem_name); ProUtilErrPrint(err_list.error_list->error, err_str); ProTKFprintf(stderr, (char*)"Err %d: %s, %s\n", i, err_str, elem_str); ProTKSprintf(title, (char*)"Error %d", i); ProTKSprintf(text, (char*)"%s, %s", err_str, elem_str); ProTKPrintf ((char*)"%s\n", title); ProTKPrintf ((char*)"%s\n",text); } return (PRO_TK_NO_ERROR); } /*====================================================================*\ FUNCTION : ProTestSelectionPreCustFilter PURPOSE : \*====================================================================*/ ProError ProTestSelectionPreCustFilter( ProSelection selection, Pro3dPnt point, ProMatrix transform, char * option, int level, ProAppData app_data) { ProModelitem feature; ProFeattype feat_type; ProError err; err = ProSelectionModelitemGet ( selection, &feature); TEST_CALL_REPORT("ProSelectionModelitemGet()", "ProTestSelectionPreCustFilter()", err, err != PRO_TK_NO_ERROR ); err = ProFeatureTypeGet ( &feature, &feat_type); TEST_CALL_REPORT("ProFeatureTypeGet()", "ProTestSelectionPreCustFilter()", err, err != PRO_TK_NO_ERROR ); if (feat_type == PRO_FEAT_CUSTOMIZE) return PRO_TK_NO_ERROR; return (PRO_TK_CONTINUE); } /*====================================================================*\ FUNCTION : ProTestSelectionPreNcseqFilter PURPOSE : \*====================================================================*/ ProError ProTestSelectionPreNcseqFilter( ProSelection selection, Pro3dPnt point, ProMatrix transform, char * option, int level, ProAppData app_data) { ProModelitem feature; ProFeattype feat_type; ProError err; err = ProSelectionModelitemGet ( selection, &feature); TEST_CALL_REPORT("ProSelectionModelitemGet()", "ProTestSelectionPreNcseqFilter()", err, err != PRO_TK_NO_ERROR ); err = ProFeatureTypeGet ( &feature, &feat_type); TEST_CALL_REPORT("ProFeatureTypeGet()", "ProTestSelectionPreNcseqFilter()", err, err != PRO_TK_NO_ERROR ); if (feat_type == PRO_FEAT_AUXILIARY) return PRO_TK_NO_ERROR; return (PRO_TK_CONTINUE); } /*====================================================================*\ FUNCTION : ProTestCustmzSelect PURPOSE : Select cust. feature. \*====================================================================*/ ProError ProTestCustmzSelect( ProSelection * customize ) { ProSelFunctions sel_funcs; ProError err; int nsels; ProSelection * sel; sel_funcs.pre_filter = (ProSelectionPreFilter)ProTestSelectionPreCustFilter; sel_funcs.post_filter = NULL; sel_funcs.post_selact = NULL; sel_funcs.app_data = NULL; err = ProSelect ( (char*)"feature", 1, NULL, &sel_funcs, NULL, NULL, &sel, &nsels); TEST_CALL_REPORT("ProSelect()", "ProTestCustmzSelect()", err, err != PRO_TK_NO_ERROR ); if (nsels == 0) *customize = NULL; else *customize = sel[0]; return (err); } /*====================================================================*\ FUNCTION : ProTestNclActionDo PURPOSE : \*====================================================================*/ ProError ProTestNclActionDo ( ProElement elem_tree) { ProError err; int menu_action, menu_id; /*------------------------------------------------------------------------*\ Select action for custm elem tree \*------------------------------------------------------------------------*/ err = ProMenuFileRegister( (char*)"TkClcmd", (char*)"tkclcmd.mnu", &menu_id ); TEST_CALL_REPORT( "ProMenuFileRegister()", "ProUtilNcseqElemSurfacesAdd()", err, err != PRO_TK_NO_ERROR ); /* Define menu buttons */ ProMenubuttonActionSet( (char*)"TkClcmd", (char*)"-Create", (ProMenubuttonAction)ProTestChooseNclAct, elem_tree, TEST_NCL_CREATE ); ProMenubuttonActionSet( (char*)"TkClcmd", (char*)"-Remove", (ProMenubuttonAction)ProTestChooseNclAct, elem_tree, TEST_NCL_REMOVE); ProMenubuttonActionSet( (char*)"TkClcmd", (char*)"-RemoveByIdx", (ProMenubuttonAction)ProTestChooseNclAct, elem_tree, TEST_NCL_REMOVE_BY_IDX); ProMenubuttonActionSet( (char*)"TkClcmd", (char*)"-RedefineByIdx", (ProMenubuttonAction)ProTestChooseNclAct, elem_tree, TEST_NCL_REDEFINE_BY_IDX); ProMenubuttonActionSet( (char*)"TkClcmd", (char*)"-Redefine", (ProMenubuttonAction)ProTestChooseNclAct, elem_tree, TEST_NCL_REDEFINE); ProMenubuttonActionSet( (char*)"TkClcmd", (char*)"-Done", (ProMenubuttonAction)ProMenuDelete, NULL, 0 ); ProMenubuttonActionSet( (char*)"TkClcmd", (char*)"TkClcmd", (ProMenubuttonAction)ProMenuDelete, NULL, 0 ); err = ProMenuCreate( PROMENUTYPE_MAIN, (char*)"TkClcmd", &menu_id ); TEST_CALL_REPORT( "ProMenuCreate()", "ProTestNclActionDo()", err, err != PRO_TK_NO_ERROR ); if( err == PRO_TK_NO_ERROR ) { err = ProMenuProcess( (char*)"TkClcmd", &menu_action ); TEST_CALL_REPORT( "ProMenuProcess()", "ProTestNclActionDo()", err, err != PRO_TK_NO_ERROR ); } return PRO_TK_NO_ERROR; } /*====================================================================*\ FUNCTION :ProTestCustmzCreate PURPOSE : \*====================================================================*/ ProError ProTestCustmzCreate( int ref_ncseq_id, ProSelection owner) { ProError err = PRO_TK_NO_ERROR; ProElement custmz_elem = NULL; ProElement custmz_elem_tree = NULL; ProValue value; ProValueData value_data; ProErrorlist errors; ProFeature custmz_feat; ProFeatureCreateOptions *opts = 0; static UserElemTable custmz_elem_table[] = { { PRO_E_FEATURE_TYPE, PRO_VALUE_TYPE_INT }, { PRO_E_REF_NCSEQ, PRO_VALUE_TYPE_INT }, { PRO_E_NCL_COMMANDS, ARRAY }}; int custmz_elem_type_size = sizeof (custmz_elem_table)/sizeof (UserElemTable); int ii; err = ProElementAlloc (PRO_E_FEATURE_TREE, &custmz_elem_tree); for (ii = 0; ii < custmz_elem_type_size; ii++) { err = ProElementAlloc (custmz_elem_table[ii].elem_type, &custmz_elem); TEST_CALL_REPORT( "ProElementAlloc()", "ProTestCustmzCreate()", err, err != PRO_TK_NO_ERROR ); switch (custmz_elem_table[ii].elem_type) { case PRO_E_FEATURE_TYPE: err = ProElementIntegerSet (custmz_elem, PRO_FEAT_CUSTOMIZE); TEST_CALL_REPORT( "ProElementIntegerSet()", "ProTestCustmzCreate()", err, err != PRO_TK_NO_ERROR ); break; case PRO_E_REF_NCSEQ: err = ProElementIntegerSet (custmz_elem, ref_ncseq_id); TEST_CALL_REPORT( "ProElementIntegerSet()", "ProTestCustmzCreate()", err, err != PRO_TK_NO_ERROR ); break; case PRO_E_NCL_COMMANDS: err = ProElemtreeElementAdd (custmz_elem_tree, NULL, custmz_elem); TEST_CALL_REPORT( "ProElemtreeElementAdd()", "ProTestCustmzCreate()", err, err != PRO_TK_NO_ERROR ); err = ProTestNclActionDo (custmz_elem_tree); break; default: return PRO_TK_GENERAL_ERROR; } value_data.type = (ProValueDataType)custmz_elem_table[ii].val_type; if (custmz_elem_table[ii].val_type != ARRAY) { if (err == PRO_TK_NO_ERROR) { err = ProElemtreeElementAdd (custmz_elem_tree, NULL, custmz_elem); TEST_CALL_REPORT( "ProElemtreeElementAdd()", "ProTestCustmzCreate()", err, err != PRO_TK_NO_ERROR ); } else { ProElementFree (&custmz_elem); TEST_CALL_REPORT( "ProElementFree()", "ProTestCustmzCreate()", err, err != PRO_TK_NO_ERROR ); } }/* if ARRAY */ } if (err == PRO_TK_NO_ERROR) { err = ProArrayAlloc(1,sizeof(ProFeatureCreateOptions), 1, (ProArray*)&opts); opts[0]= PRO_FEAT_CR_NO_OPTS; err = ProFeatureWithoptionsCreate (owner, custmz_elem_tree, opts, PRO_REGEN_NO_FLAGS, &custmz_feat, &errors); TEST_CALL_REPORT( "ProFeatureWithoptionsCreate()", "ProTestCustmzCreate()", err, err != PRO_TK_NO_ERROR ); err = ProArrayFree((ProArray*)&opts); } if (err != PRO_TK_NO_ERROR) { ProTestPrintErrs1(errors); } return err; } /*====================================================================*\ FUNCTION : PURPOSE : \*====================================================================*/ int ProTestCustmzCreateMenuAct( void* p_dummy, int action ) { ProError err; int nsels; ProSelection * sel; ProSelFunctions sel_funcs; int ref_ncseq_id; ProFeature ref_ncseq; ProSelection custm_owner; ProMdl mfg; ProSolid mfg_solid; ProAsmcomppath comp_path; ProModelitem storage; sel_funcs.pre_filter = (ProSelectionPreFilter)ProTestSelectionPreNcseqFilter; sel_funcs.post_filter = NULL; sel_funcs.post_selact = NULL; sel_funcs.app_data = NULL; err = ProSelect ( (char*)"feature", 1, NULL, &sel_funcs, NULL, NULL, &sel, &nsels); TEST_CALL_REPORT("ProSelect()", "ProTestCustmzCreateMenuAct()", err, err != PRO_TK_NO_ERROR ); if (nsels <1) return PRO_TK_NO_ERROR; err = ProSelectionModelitemGet (sel[0], &ref_ncseq); TEST_CALL_REPORT("ProSelectionModelitemGet()", "ProTestCustmzCreateMenuAct()", err, err != PRO_TK_NO_ERROR ); ref_ncseq_id = ref_ncseq.id; err = ProMdlCurrentGet (&mfg); TEST_CALL_REPORT("ProMdlCurrentGet()", "ProTestCustmzCreateMenuAct()", err, err != PRO_TK_NO_ERROR ); err = ProMfgSolidGet ((ProMfg)mfg, &mfg_solid); TEST_CALL_REPORT("ProMfgSolidGet()", "ProTestCustmzCreateMenuAct()", err, err != PRO_TK_NO_ERROR ); err = ProMfgFeatureOwnerGet ((ProMfg)mfg, &comp_path); TEST_CALL_REPORT("ProMfgFeatureOwnerGet()", "ProTestCustmzCreateMenuAct()", err, err != PRO_TK_NO_ERROR ); err = ProModelitemInit (mfg_solid, PRO_TK_NOT_USED, (ProType)PRO_TK_NOT_USED, &storage ); TEST_CALL_REPORT("ProModelitemInit()", "ProTestCustmzCreateMenuAct()", err, err != PRO_TK_NO_ERROR ); err = ProSelectionAlloc (&comp_path, &storage, &custm_owner); TEST_CALL_REPORT("ProSelectionAlloc()", "ProTestCustmzCreateMenuAct()", err, err != PRO_TK_NO_ERROR ); err = ProTestCustmzCreate( ref_ncseq_id, custm_owner); return (0); } /*====================================================================*\ FUNCTION : ProTestCustoElemtreeGet PURPOSE : \*====================================================================*/ ProError ProTestCustoElemtreeGet ( ProModelitem* custm, ProSolid * mfg_solid, ProSelection * custm_owner, ProElement * elem_tree, ProAsmcomppath * comp_path ) { ProError err; ProSelection customize; ProMdl mfg; ProModelitem storage; ProMfgType m_type; /*------------------------------------------------------------------------*\ 1. Select customize feature. \*------------------------------------------------------------------------*/ err = ProTestCustmzSelect (&customize); if (err != PRO_TK_NO_ERROR) return (PRO_TK_USER_ABORT); err = ProSelectionModelitemGet (customize, custm); TEST_CALL_REPORT("ProSelectionModelitemGet()", "ProTestCustoElemtreeGet()", err, err != PRO_TK_NO_ERROR ); /*------------------------------------------------------------------------*\ 2. Obtain ProSelection feature owner for ProFeatureCreate 2a. Obtain manufacture storage solid 2b. Obtain asm path to feature owner 2c. Fill model item for storage solid 2d. Create ProSelection for mfg feature owner \*------------------------------------------------------------------------*/ err = ProMdlCurrentGet (&mfg); TEST_CALL_REPORT("ProMdlCurrentGet()", "ProTestCustoElemtreeGet()", err, err != PRO_TK_NO_ERROR ); err = ProMfgTypeGet ((ProMfg)mfg, &m_type); TEST_CALL_REPORT("ProMfgTypeGet()", "ProTestCustoElemtreeGet()", err, err != PRO_TK_NO_ERROR ); err = ProMfgSolidGet ((ProMfg)mfg, mfg_solid); TEST_CALL_REPORT("ProMfgSolidGet()", "ProTestCustoElemtreeGet()", err, err != PRO_TK_NO_ERROR ); err = ProMfgFeatureOwnerGet ((ProMfg)mfg, comp_path); TEST_CALL_REPORT("ProMfgFeatureOwnerGet()", "ProTestCustoElemtreeGet()", err, err != PRO_TK_NO_ERROR ); err = ProModelitemInit ((*mfg_solid), PRO_TK_NOT_USED, (ProType)PRO_TK_NOT_USED, &storage ); TEST_CALL_REPORT("ProModelitemInit()", "ProTestCustoElemtreeGet()", err, err != PRO_TK_NO_ERROR ); err = ProSelectionAlloc (comp_path, &storage, custm_owner); TEST_CALL_REPORT("ProSelectionAlloc()", "ProTestCustoElemtreeGet()", err, err != PRO_TK_NO_ERROR ); /*------------------------------------------------------------------------*\ Naw we have ProSelection Next: Obtain elem tree \*------------------------------------------------------------------------*/ err = ProFeatureElemtreeExtract (custm, NULL, PRO_FEAT_EXTRACT_NO_OPTS, elem_tree); TEST_CALL_REPORT("ProFeatureElemtreeExtract()", "ProTestCustoElemtreeGet()", err, err != PRO_TK_NO_ERROR ); err = ProTestNclActionDo (*elem_tree); return err; } /*====================================================================*\ FUNCTION : ProTestCustmzRecreate PURPOSE : Select and recreate cust. feature. \*====================================================================*/ int ProTestCustmzRecreate( void* p_dummy, int action ) { ProError err; ProSelection custm_owner; ProSolid mfg_solid; ProAsmcomppath comp_path; ProModelitem custm; ProElement elem_tree = NULL; ProFeature new_custom; ProErrorlist errors; ProFeatureCreateOptions *opts = 0; ProFeatureDeleteOptions *delete_opts = 0; int *feat_ids = NULL; err = ProTestCustoElemtreeGet (&custm, &mfg_solid, &custm_owner, &elem_tree, &comp_path); if (err == PRO_TK_USER_ABORT) return (0); err = ProArrayAlloc(1,sizeof(ProFeatureDeleteOptions), 1, (ProArray*)&delete_opts); delete_opts[0] = PRO_FEAT_DELETE_NO_OPTS; err = ProArrayAlloc(1,sizeof(int), 1, (ProArray*)&feat_ids); feat_ids[0] = custm.id; err = ProFeatureWithoptionsDelete (mfg_solid, feat_ids, delete_opts, PRO_REGEN_NO_FLAGS); TEST_CALL_REPORT("ProFeatureWithoptionsDelete()", "ProTestCustmzRecreate()", err, err != PRO_TK_NO_ERROR ); err = ProArrayFree((ProArray*)&delete_opts); err = ProArrayFree((ProArray*)&feat_ids); /*------------------------------------------------------------------------*\ Create feature \*------------------------------------------------------------------------*/ err = ProArrayAlloc(1,sizeof(ProFeatureCreateOptions), 1, (ProArray*)&opts); opts[0]= PRO_FEAT_CR_NO_OPTS; err = ProFeatureWithoptionsCreate (custm_owner, elem_tree, opts, PRO_REGEN_NO_FLAGS, &new_custom, &errors); TEST_CALL_REPORT("ProFeatureWithoptionsCreate()", "ProTestCustmzRecreate()", err, err != PRO_TK_NO_ERROR ); err = ProArrayFree((ProArray*)&opts); if (err != PRO_TK_NO_ERROR) { ProTestPrintErrs1(errors); } return ( (int)err); } /*====================================================================*\ FUNCTION : ProTestCustmzRedefine PURPOSE : Select and redefine cust. feature. \*====================================================================*/ int ProTestCustmzRedefine( void* p_dummy, int action ) { ProError err; ProSelection custm_owner; ProSolid mfg_solid; ProAsmcomppath comp_path; ProModelitem custm; ProElement elem_tree = NULL; ProErrorlist errors; ProFeatureCreateOptions *opts = 0; err = ProTestCustoElemtreeGet (&custm, &mfg_solid, &custm_owner, &elem_tree, &comp_path); if (err == PRO_TK_USER_ABORT) return (0); /*------------------------------------------------------------------------*\ Redefine feature \*------------------------------------------------------------------------*/ err = ProArrayAlloc(1,sizeof(ProFeatureCreateOptions), 1, (ProArray*)&opts); opts[0]= PRO_FEAT_CR_NO_OPTS; err = ProFeatureWithoptionsRedefine (&comp_path, &custm, elem_tree , opts, PRO_REGEN_NO_FLAGS, &errors); TEST_CALL_REPORT("ProFeatureWithoptionsRedefine()", "ProTestCustmzRedefine()", err, err != PRO_TK_NO_ERROR ); err = ProArrayFree((ProArray*)&opts); if (err != PRO_TK_NO_ERROR) { ProTestPrintErrs1(errors); } return (0); } /*====================================================================*\ FUNCTION : TestFileGet PURPOSE : \*====================================================================*/ int TestFileGet ( FILE ** ff) { ProCharLine ch_file_name; ProLine wname; do { ProUtilMsgPrint((char*)"gen",(char*)"TEST %0s", "Enter file name [NONE]: "); if (!ProUtilStringGet(wname, NULL, PRO_LINE_SIZE-1)) return (1); ProWstringToString (ch_file_name, wname); }while ((*ff = PTApplsUnicodeFopen (ch_file_name, "rt")) == NULL); return 0; } /*====================================================================*\ FUNCTION : ProTestClCmdDataGet PURPOSE : \*====================================================================*/ int ProTestClCmdDataGet ( FILE *cmgfile, /* in */ wchar_t*** cmds, /* out wlines */ int * icmds, ProVector cmd_loc, /* out */ ProVector cmd_axis) /* out */ { ProCharLine cstr_from; char * cur_tk; char * end_dbl; double dbl, * pdbl; wchar_t * wcur_tk; int i; ProError err; memset (cmd_loc, 0, sizeof (ProVector)); memset (cmd_axis, 0, sizeof (ProVector)); err = ProArrayAlloc (0, sizeof (wchar_t*), 1, (ProArray *)cmds ); TEST_CALL_REPORT("ProArrayAlloc()", "ProTestClCmdDataGet()", err, err != PRO_TK_NO_ERROR ); if ( (fgets (cstr_from, PRO_LINE_SIZE, cmgfile ) == NULL) || (cstr_from[0] == '\0') || (cstr_from[0] == '\n')) return 0; cur_tk = strtok ((char*)cstr_from, " \t,\n"); dbl = strtod ( cur_tk, &end_dbl); if (cur_tk == end_dbl && cur_tk != NULL) { wcur_tk = (wchar_t *) calloc (PRO_LINE_SIZE, sizeof (wchar_t)); ProStringToWstring (wcur_tk, cur_tk); err = ProArrayObjectAdd ((ProArray*) cmds, PRO_VALUE_UNUSED,1, &wcur_tk); } else return (0); for (i = 0; (cur_tk = strtok (NULL, " \t,\n")) != NULL; i++) { dbl = strtod ( cur_tk, &end_dbl); if (cur_tk == end_dbl) { wcur_tk = (wchar_t *) calloc(PRO_LINE_SIZE, sizeof (wchar_t)); ProStringToWstring (wcur_tk, cur_tk); err = ProArrayObjectAdd ((ProArray*) cmds, PRO_VALUE_UNUSED, 1, &wcur_tk); TEST_CALL_REPORT("ProArrayObjectAdd()", "ProTestClCmdDataGet()", err, err != PRO_TK_NO_ERROR ); i--; continue; } pdbl = ((i<3) ? &(cmd_loc[i]) : &(cmd_axis[i-3])); *pdbl = dbl; } err = ProArraySizeGet ((ProArray)*cmds, icmds); TEST_CALL_REPORT("ProArraySizeGet()", "ProTestClCmdDataGet()", err, err != PRO_TK_NO_ERROR ); wcur_tk = NULL; err = ProArrayObjectAdd ((ProArray*) cmds, PRO_VALUE_UNUSED,1, &wcur_tk); TEST_CALL_REPORT("ProArrayObjectAdd()", "ProTestClCmdDataGet()", err, err != PRO_TK_NO_ERROR ); return (1); } /*====================================================================*\ FUNCTION : ProTestClCmdDataPrint PURPOSE : \*====================================================================*/ int ProTestClCmdDataPrint ( wchar_t** cmds, /* out wlines */ int icmds, ProVector cmd_loc, /* out */ ProVector cmd_axis) /* out */ { int arr_size, i; ProError err; ProCharLine cstr; err = ProArraySizeGet ((ProArray) cmds, &arr_size); TEST_CALL_REPORT("ProArraySizeGet()", "ProTestClCmdDataPrint()", err, err != PRO_TK_NO_ERROR ); for (i= 0; i<arr_size; i++) { if (cmds[i] != NULL) { ProWstringToString (cstr, cmds[i]); ProTKPrintf ((char*)"%s ", cstr); } } ProTKPrintf ((char*)"%d ", icmds); ProTKPrintf ((char*)"%f %f %f %f %f %f \n", cmd_loc[0], cmd_loc[1], cmd_loc[2], cmd_axis[0], cmd_axis[1], cmd_axis[2]); return 0; } /*====================================================================*\ FUNCTION : ProTestClcmdElemCreate PURPOSE : reads info from file creats Clcmd elements and adds \*====================================================================*/ ProError ProTestClcmdElemCreate( ProElement NclCmds) /* elem to add Clcmds elements */ { #ifndef PT_PRODUCTS_BUILD ProError err; FILE * clcs_file; wchar_t **wlines; int incmds; ProElement ncl_commd_elem; double * pos; double *axis; ProVector commd_loc, commd_axis; if ( TestFileGet ( &clcs_file) ) return (PRO_TK_GENERAL_ERROR); for (;ProTestClCmdDataGet(clcs_file, &wlines, &incmds, commd_loc, commd_axis);) { ProTestClCmdDataPrint( wlines, incmds, commd_loc, commd_axis); if (commd_loc[0] == 0.0 && commd_loc[1] == 0.0 && commd_loc[2] == 0.0) pos = NULL; else pos = commd_loc; if (commd_axis[0] == 0.0 && commd_axis[1] == 0.0 && commd_axis[2] == 0.0) axis = NULL; else axis = commd_axis; err = ProClcmdElemCreate ((wchar_t**)wlines, incmds, pos, axis, &ncl_commd_elem); TEST_CALL_REPORT("ProClcmdElemCreate()", "ProTestClcmdElemCreate()", err, err != PRO_TK_NO_ERROR ); err = ProClcmdElemAdd (NclCmds, ncl_commd_elem, -1); TEST_CALL_REPORT("ProClcmdElemAdd()", "ProTestClcmdElemCreate()", err, err != PRO_TK_NO_ERROR ); err =ProTestCmdsArrayFree (&wlines); } fclose (clcs_file); return (PRO_TK_NO_ERROR); #else return PRO_TK_NOT_IMPLEMENTED; #endif } /*====================================================================*\ FUNCTION : ProTestClcmdRemove PURPOSE : reads info from file and removes Clcmd elements \*====================================================================*/ ProError ProTestClcmdElemRemove( ProElement elem_tree) /* elem tree */ { #ifndef PT_PRODUCTS_BUILD ProError err; FILE * clcs_file; wchar_t * *wlines; int incmds; double * pos; double *axis; ProVector commd_loc, commd_axis; if ( TestFileGet ( &clcs_file) ) return (PRO_TK_GENERAL_ERROR); for (;ProTestClCmdDataGet(clcs_file, &wlines, &incmds, commd_loc, commd_axis);) { ProTestClCmdDataPrint( wlines, incmds, commd_loc, commd_axis); if (commd_loc[0] == 0.0 && commd_loc[1] == 0.0 && commd_loc[2] == 0.0) pos = NULL; else pos = commd_loc; if (commd_axis[0] == 0.0 && commd_axis[1] == 0.0 && commd_axis[2] == 0.0) axis = NULL; else axis = commd_axis; err = ProClcmdElemRemove (elem_tree, wlines, incmds, pos, axis, NULL); TEST_CALL_REPORT("ProClcmdElemRemove()", "ProTestClcmdElemRemove()", err, err != PRO_TK_NO_ERROR ); ProTestCmdsArrayFree (&wlines); } fclose (clcs_file); return (PRO_TK_NO_ERROR); #else return PRO_TK_NOT_IMPLEMENTED; #endif } /*====================================================================*\ FUNCTION : ProTestClcmdRemoveByIndex PURPOSE : ask indexes and removes Clcmd elements \*====================================================================*/ ProError ProTestClcmdElemRemoveByIndex( ProElement elem_tree) /* elem tree */ { #ifndef PT_PRODUCTS_BUILD ProError err; int index, range[2] = {0, 100}; while (1 == 1) { ProUtilMsgPrint((char*)"gen",(char*)"TEST %0s", "Enter an element index to remove [Quit]: "); if (!ProUtilIntGet(range, NULL, &index)) return (PRO_TK_NO_ERROR); err = ProClcmdElemRemoveByIndex (elem_tree, index, NULL); TEST_CALL_REPORT("ProClcmdElemRemoveByIndex()", "ProTestClcmdElemRemoveByIndex()", err, err != PRO_TK_NO_ERROR ); } #else return PRO_TK_NOT_IMPLEMENTED; #endif } /*====================================================================*\ FUNCTION : ProTestClcmdAdd PURPOSE : Adds custamazed elem to feature tree \*====================================================================*/ ProError ProTestClcmdElemAdd( ProElement elem_tree) /* elem tree */ { return (PRO_TK_NO_ERROR); } /*====================================================================*\ FUNCTION : ProTestClcmdRedefineByIndex PURPOSE : ask indexes and reads info from file to redefine Clcmd elements \*====================================================================*/ ProError ProTestClcmdElemRedefineByIndex( ProElement elem_tree) /* elem tree */ { #ifndef PT_PRODUCTS_BUILD ProError err; FILE * clcs_file; wchar_t * *wlines; ProElement ncl_commd_elem; double * pos; double *axis; int index, range[2] = {0, 100}; int incmds; ProVector commd_loc, commd_axis; if ( TestFileGet ( &clcs_file) ) return (PRO_TK_GENERAL_ERROR); while (1 == 1) { ProUtilMsgPrint((char*)"gen",(char*)"TEST %0s", "Enter an element index to redefine [Quit]: "); if (!ProUtilIntGet(range, NULL, &index)) break; err = ProClcmdElemGetByIndex (elem_tree, index, &ncl_commd_elem); TEST_CALL_REPORT("ProClcmdElemGetByIndex()", "ProTestClcmdElemRedefineByIndex()", err, err != PRO_TK_NO_ERROR ); if (!ProTestClCmdDataGet(clcs_file, &wlines, &incmds, commd_loc, commd_axis)) break; ProTestClCmdDataPrint( wlines, incmds, commd_loc, commd_axis); if (commd_loc[0] == 0.0 && commd_loc[1] == 0.0 && commd_loc[2] == 0.0) pos = NULL; else pos = commd_loc; if (commd_axis[0] == 0.0 && commd_axis[1] == 0.0 && commd_axis[2] == 0.0) axis = NULL; else axis = commd_axis; err = ProClcmdElemSet (ncl_commd_elem, wlines, incmds, pos, axis); TEST_CALL_REPORT("ProClcmdElemSet()", "ProTestClcmdElemRedefineByIndex()", err, err != PRO_TK_NO_ERROR ); ProTestCmdsArrayFree (&wlines); } fclose (clcs_file); return (PRO_TK_NO_ERROR); #else return PRO_TK_NOT_IMPLEMENTED; #endif } /*====================================================================*\ FUNCTION : ProTestClcmdRedefine PURPOSE : reads info from one file to redefine Clcmd elements using info from anather file \*====================================================================*/ ProError ProTestClcmdElemRedefine( ProElement elem_tree) /* elem tree */ { #ifndef PT_PRODUCTS_BUILD ProError err; FILE * clcs_file_from; FILE * clcs_file_to; wchar_t * *wlines; wchar_t * *wlines_to; int incmds; ProElement ncl_commd_elem; double * pos; double *axis; ProVector commd_loc, commd_axis; if ( TestFileGet ( &clcs_file_from) ) return (PRO_TK_GENERAL_ERROR); if ( TestFileGet ( &clcs_file_to) ) { fclose (clcs_file_from); return (PRO_TK_GENERAL_ERROR); } for (;ProTestClCmdDataGet(clcs_file_from, &wlines, &incmds, commd_loc, commd_axis);) { ProTestClCmdDataPrint( wlines, incmds, commd_loc, commd_axis); if (commd_loc[0] == 0.0 && commd_loc[1] == 0.0 && commd_loc[2] == 0.0) pos = NULL; else pos = commd_loc; if (commd_axis[0] == 0.0 && commd_axis[1] == 0.0 && commd_axis[2] == 0.0) axis = NULL; else axis = commd_axis; err = ProClcmdElemGet (elem_tree, wlines, incmds, pos, axis, &ncl_commd_elem); TEST_CALL_REPORT("ProClcmdElemGet()", "ProTestClcmdElemRedefine()", err, err != PRO_TK_NO_ERROR ); if (!ProTestClCmdDataGet(clcs_file_to, &wlines_to, &incmds, commd_loc, commd_axis)) break; ProTestClCmdDataPrint( wlines_to, incmds, commd_loc, commd_axis); if (commd_loc[0] == 0.0 && commd_loc[1] == 0.0 && commd_loc[2] == 0.0) pos = NULL; else pos = commd_loc; if (commd_axis[0] == 0.0 && commd_axis[1] == 0.0 && commd_axis[2] == 0.0) axis = NULL; else axis = commd_axis; err = ProClcmdElemSet (ncl_commd_elem, wlines_to, incmds, pos, axis); TEST_CALL_REPORT("ProClcmdElemSet()", "ProTestClcmdElemRedefine()", err, err != PRO_TK_NO_ERROR ); ProTestCmdsArrayFree (&wlines); ProTestCmdsArrayFree (&wlines_to); } fclose (clcs_file_from); fclose (clcs_file_to); return (PRO_TK_NO_ERROR); #else return PRO_TK_NOT_IMPLEMENTED; #endif } /*====================================================================*\ FUNCTION : ProTestCmdsArrayFree PURPOSE : \*====================================================================*/ ProError ProTestCmdsArrayFree ( wchar_t*** cmds) /* in wlines */ { int arr_size, i; ProError err; err = ProArraySizeGet ((ProArray) *cmds, &arr_size); TEST_CALL_REPORT("ProArraySizeGet()", "ProTestCmdsArrayFree()", err, err != PRO_TK_NO_ERROR ); for (i= 0; i<arr_size; i++) { if ((*cmds)[i] != NULL) free ((*cmds)[i]); } err = ProArrayFree ((ProArray *) cmds ); TEST_CALL_REPORT("ProArrayFree()", "ProTestCmdsArrayFree()", err, err != PRO_TK_NO_ERROR ); return err; }