/* Copyright (c) 2024 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved. */ /*--------------------------------------------------------------------*\ Pro/TOOLKIT includes \*--------------------------------------------------------------------*/ #include <ProToolkit.h> #include <ProMenu.h> #include <ProMessage.h> #include <ProMdl.h> #include <ProModelitem.h> #include <ProFamtable.h> #include <ProFaminstance.h> #include <ProParameter.h> #include <ProSelection.h> #include <ProFeature.h> #include <ProFeatType.h> #include <ProUtil.h> #include <ProSolid.h> #include <ProGtol.h> #include <ProWindows.h> #include <ProTKRunTime.h> #include "TestFamTab.h" #include "TestError.h" #include "UtilFiles.h" #include "UtilMessage.h" #include "UtilString.h" #include "UtilMenu.h" #include "UtilCollect.h" /*--------------------------------------------------------------------*\ Application macros \*--------------------------------------------------------------------*/ #define PROERROR_RETURN(error) if(error != PRO_TK_NO_ERROR) return(error) #define OUT_FILE_EXT ".ftb" #define PRO_TEST_FAM_EDIT 0 #define PRO_TEST_FAM_SHOW 1 #define PRO_TEST_FAM_ERASE 2 /*--------------------------------------------------------------------*\ Application data types \*--------------------------------------------------------------------*/ typedef struct app_data { ProFamtable *p_famtab; ProFamtableItem *p_item; FILE *fp; } ProTestAppData; /*--------------------------------------------------------------------*\ Application global/external data \*--------------------------------------------------------------------*/ extern int ProTestFamAddInst (ProFamtable *p_famtab); extern int ProTestFamDelInst (ProFamtable *p_famtab); extern int ProTestFamInstRetrieve (ProFamtable *p_famtab); extern int ProTestFamtabActions(ProFamtable *p_famtab, int action); extern int ProTestFamAddColumn (ProFamtable *p_famtab); extern int ProTestFamDelColumn (ProFamtable *p_famtab); extern int ProTestFamShowInst (ProFamtable *p_famtab); extern int ProTestFamLockInst (ProFamtable *p_famtab); extern int ProTestFamShowGeneric (ProFamtable *p_famtab); extern int ProTestFamShowFile (ProFamtable *p_famtab); extern int ProTestFamTypeMenu (); ProError ProTestModelDisplay( ProMdl p_model ); /*--------------------------------------------------------------------*\ Application static data/function \*--------------------------------------------------------------------*/ static int ProTestFamExitActionUp( char *dummy, int type); /*============================================================================*\ Function: ProTestTkFamilyMenu Purpose: To set-up the user's family menu \*============================================================================*/ int ProTestFamlyTabMenu( ProAppData p_appdata, int int_dummy ) { ProMdl p_model = *((ProMdl*)p_appdata); ProFamtable famtable; int menu_id, action; ProError status; status = ProFamtableInit( p_model, &famtable ); TEST_CALL_REPORT("ProFamtableInit()", "ProTestFamlyTabMenu()", status, status != PRO_TK_NO_ERROR); ProMenuPush(); ProMenuFileRegister((char *)"TkFamTab",(char *)"tkfamtab.mnu", &menu_id); ProMenubuttonActionSet((char *)"TkFamTab",(char *)"TkFamTab", (ProMenubuttonAction)ProMenuDelete, NULL, 0); ProMenubuttonActionSet((char *)"TkFamTab",(char *)"-Add Column", (ProMenubuttonAction)ProTestFamAddColumn, &famtable, 0); ProMenubuttonActionSet((char *)"TkFamTab",(char *)"-Del Column", (ProMenubuttonAction)ProTestFamDelColumn, &famtable, 0); ProMenubuttonActionSet((char *)"TkFamTab",(char *)"-Add Instance", (ProMenubuttonAction)ProTestFamAddInst, &famtable, 0); ProMenubuttonActionSet((char *)"TkFamTab",(char *)"-Del Instance", (ProMenubuttonAction)ProTestFamDelInst, &famtable, 0); ProMenubuttonActionSet((char *)"TkFamTab",(char *)"-Retr Instance", (ProMenubuttonAction)ProTestFamInstRetrieve, &famtable, 0); ProMenubuttonActionSet((char *)"TkFamTab",(char *)"-Edit Table", (ProMenubuttonAction)ProTestFamtabActions, &famtable, PRO_TEST_FAM_EDIT); ProMenubuttonActionSet((char *)"TkFamTab",(char *)"-Show Table", (ProMenubuttonAction)ProTestFamtabActions, &famtable, PRO_TEST_FAM_SHOW); ProMenubuttonActionSet((char *)"TkFamTab",(char *)"-Clear Table", (ProMenubuttonAction)ProTestFamtabActions, &famtable, PRO_TEST_FAM_ERASE); ProMenubuttonActionSet((char *)"TkFamTab",(char *)"-Show Instance", (ProMenubuttonAction)ProTestFamShowInst, &famtable, 0); ProMenubuttonActionSet((char *)"TkFamTab",(char *)"-Lock Instance", (ProMenubuttonAction)ProTestFamLockInst, &famtable, 0); ProMenubuttonActionSet((char *)"TkFamTab",(char *)"-Show generic", (ProMenubuttonAction)ProTestFamShowGeneric, &famtable, 0); ProMenubuttonActionSet((char *)"TkFamTab",(char *)"-Show File", (ProMenubuttonAction)ProTestFamShowFile, &famtable, 0); ProMenubuttonActionSet((char *)"TkFamTab",(char *)"-Done TkFamTab", (ProMenubuttonAction)ProMenuDelete, NULL, 0); ProMenuCreate(PROMENUTYPE_MAIN, (char *)"TkFamTab", &menu_id); ProMenuProcess((char *)"", &action); ProMenuPop(); return (0); } /*===========================================================================*\ Function : TestFamSelectionExtRefFilter Purpose : Filter for ProSelect function (for PRO_FEAT_GEOM_COPY) \*===========================================================================*/ ProError TestFamSelectionExtRefFilter( ProSelection selection, Pro3dPnt point, ProMatrix transform, char * option, int level, ProAppData app_data) { ProFeature feat; ProError err; ProFeattype type; err = ProSelectionModelitemGet ( selection, &feat); TEST_CALL_REPORT("ProSelectionModelitemGet()", "TestFamSelectionExtRefFilter()", err, err != PRO_TK_NO_ERROR ); err = ProFeatureTypeGet (&feat, &type); TEST_CALL_REPORT ("ProFeatureTypeGet()", "TestFamSelectionExtRefFilter()", err , err != PRO_TK_NO_ERROR); ProTKPrintf((char *)"Type: %d\n", type); return ((type == PRO_FEAT_GEOM_COPY)?(PRO_TK_NO_ERROR):(PRO_TK_CONTINUE)); } /*===========================================================================*\ Function : TestFamSelectionExtRefFilter Purpose : Filter for ProSelect function (for PRO_FEAT_GEN_MERGE) \*===========================================================================*/ ProError TestFamSelectionMergeFilter( ProSelection selection, Pro3dPnt point, ProMatrix transform, char * option, int level, ProAppData app_data) { ProFeature feat; ProError err; ProFeattype type; err = ProSelectionModelitemGet ( selection, &feat); TEST_CALL_REPORT("ProSelectionModelitemGet()", "TestFamSelectionExtRefFilter()", err, err != PRO_TK_NO_ERROR ); err = ProFeatureTypeGet (&feat, &type); TEST_CALL_REPORT ("ProFeatureTypeGet()", "TestFamSelectionExtRefFilter()", err , err != PRO_TK_NO_ERROR); ProTKPrintf((char *)"Type: %d\n", type); return ((type == PRO_FEAT_GEN_MERGE)?(PRO_TK_NO_ERROR):(PRO_TK_CONTINUE)); } /*===========================================================================*\ Function : ProTestFamTypeMenu Purpose : Display the family type menu \*===========================================================================*/ int ProTestFamTypeMenu() { int action; static ProUtilMenuButtons col_type[] = { {"TkFamColType", 0, TEST_CALL_PRO_MENU_DELETE}, {"-User Param", PRO_FAM_USER_PARAM, 0}, {"-Dimension", PRO_FAM_DIMENSION, 0}, {"-Feature", PRO_FAM_FEATURE, 0}, {"-Asm Comp", PRO_FAM_ASMCOMP, 0}, {"-Comp Model", PRO_FAM_ASMCOMP_MODEL, 0}, {"-Ext. ref", PRO_FAM_EXTERNAL_REFERENCE, 0}, {"-Merge Part", PRO_FAM_MERGE_PART_REF,0}, {"", 0, 0} }; /* Set-up this menu to query the user */ ProUtilMenuIntValueSelect(col_type, &action); return(action); } /*===========================================================================*\ Function: ProTestFamSelectItem Purpose: Select a family table item \*===========================================================================*/ ProError ProTestFamSelectItem( ProFamtable *p_famtable, /* In: Family table */ ProFamtableItem *p_item /* Out: Selected fam table item */ ) { ProMdl p_model; ProModelitem model_item; ProParameter param; ProSelection *sel; char option[40]; int n_sel = 0; int type; ProError status; ProAsmcomppath comp_path; ProSelFunctions sel_fun; sel_fun.pre_filter = (ProSelectionPreFilter)TestFamSelectionExtRefFilter; sel_fun.post_filter = NULL; sel_fun.post_selact = NULL; sel_fun.app_data = NULL; status = ProMdlCurrentGet( &p_model ); TEST_CALL_REPORT( "ProMdlCurrentGet()", "ProTestFamSelectItem()", status, status != PRO_TK_NO_ERROR ); type = ProTestFamTypeMenu(); switch (type) { case PRO_FAM_USER_PARAM : status = ProMdlToModelitem( p_model, &model_item ); TEST_CALL_REPORT( "ProMdlToModelitem()", "ProTestFamSelectItem()", status, status != PRO_TK_NO_ERROR); status = ProParameterSelect(&model_item, p_model, PRO_PARAMSELECT_ANY, PRO_B_FALSE, NULL, ¶m, NULL); TEST_CALL_REPORT( "ProParameterSelect()", "ProTestFamSelectItem()", status, status != PRO_TK_NO_ERROR); if( status != PRO_TK_NO_ERROR ) return PRO_TK_E_NOT_FOUND; status = ProParameterToFamtableItem( ¶m, p_item ); TEST_CALL_REPORT( "ProParameterToFamtableItem()", "ProTestFamSelectItem()", status, status != PRO_TK_NO_ERROR); break; case PRO_FAM_DIMENSION : ProUtilstrcpy(option, "dimension"); status = ProSelect (option, 1, NULL, NULL, NULL, NULL, &sel, &n_sel); TEST_CALL_REPORT("ProSelect()", "ProTestFamSelectItem()", status, status != PRO_TK_NO_ERROR); if( status != PRO_TK_NO_ERROR || n_sel < 1 ) return PRO_TK_E_NOT_FOUND; status = ProSelectionModelitemGet( sel[0], &model_item ); TEST_CALL_REPORT("ProSelectionModelitemGet()", "ProTestFamSelectItem()", status, status != PRO_TK_NO_ERROR); status = ProModelitemToFamtableItem( &model_item, p_item ); TEST_CALL_REPORT("ProModelitemToFamtableItem()", "ProTestFamSelectItem()", status, status != PRO_TK_NO_ERROR); break; case PRO_FAM_FEATURE : ProUtilstrcpy(option, "feature"); status = ProSelect (option, 1, NULL, NULL, NULL, NULL, &sel, &n_sel); TEST_CALL_REPORT("ProSelect()", "ProTestFamAddColumn()", status, status != PRO_TK_NO_ERROR); if( status != PRO_TK_NO_ERROR || n_sel < 1 ) return PRO_TK_E_NOT_FOUND; status = ProSelectionModelitemGet(sel[0], &model_item); TEST_CALL_REPORT("ProSelectionModelitemGet()", "ProTestFamSelectItem()", status, status != PRO_TK_NO_ERROR); ProTKPrintf((char *)"Type: %d\n", model_item.type); status = ProModelitemToFamtableItem( &model_item, p_item ); TEST_CALL_REPORT("ProModelitemToFamtableItem()", "ProTestFamSelectItem()", status, status != PRO_TK_NO_ERROR); break; case PRO_FAM_ASMCOMP : case PRO_FAM_ASMCOMP_MODEL : ProUtilstrcpy(option, "prt_or_asm"); status = ProSelect (option, 1, NULL, NULL, NULL, NULL, &sel, &n_sel); TEST_CALL_REPORT("ProSelect()", "ProTestFamAddColumn()", status, status != PRO_TK_NO_ERROR); if( status != PRO_TK_NO_ERROR || n_sel < 1 ) return PRO_TK_E_NOT_FOUND; ProSelectionAsmcomppathGet( sel[0], &comp_path ); if( comp_path.table_num != 1 ) { ProUtilMsgPrint( (char *)"TEST %0s", (char *)"First-level assy component must be selected" ); } model_item.type = (ProType)PRO_FEAT_COMPONENT; model_item.owner = p_model; model_item.id = comp_path.comp_id_table[0]; status = ProModelitemToFamtableItem( &model_item, p_item ); TEST_CALL_REPORT("ProModelitemToFamtableItem()", "ProTestFamSelectItem()", status, status != PRO_TK_NO_ERROR); break; case PRO_FAM_EXTERNAL_REFERENCE: ProUtilstrcpy(option, "feature"); status = ProSelect (option, 1, NULL, &sel_fun, NULL, NULL, &sel, &n_sel); TEST_CALL_REPORT("ProSelect()", "ProTestFamAddColumn()", status, status != PRO_TK_NO_ERROR); if( status != PRO_TK_NO_ERROR || n_sel < 1 ) return PRO_TK_E_NOT_FOUND; status = ProSelectionModelitemGet(sel[0], &model_item); TEST_CALL_REPORT("ProSelectionModelitemGet()", "ProTestFamSelectItem()", status, status != PRO_TK_NO_ERROR); status = ProModelitemToFamtableItem( &model_item, p_item ); TEST_CALL_REPORT("ProModelitemToFamtableItem()", "ProTestFamSelectItem()", status, status != PRO_TK_NO_ERROR); break; case PRO_FAM_MERGE_PART_REF: sel_fun.pre_filter = (ProSelectionPreFilter)TestFamSelectionMergeFilter; ProUtilstrcpy(option, "feature"); status = ProSelect (option, 1, NULL, &sel_fun, NULL, NULL, &sel, &n_sel); TEST_CALL_REPORT("ProSelect()", "ProTestFamAddColumn()", status, status != PRO_TK_NO_ERROR); if( status != PRO_TK_NO_ERROR || n_sel < 1 ) return PRO_TK_E_NOT_FOUND; status = ProSelectionModelitemGet(sel[0], &model_item); TEST_CALL_REPORT("ProSelectionModelitemGet()", "ProTestFamSelectItem()", status, status != PRO_TK_NO_ERROR); status = ProModelitemToFamtableItem( &model_item, p_item ); TEST_CALL_REPORT("ProModelitemToFamtableItem()", "ProTestFamSelectItem()", status, status != PRO_TK_NO_ERROR); break; default : status = PRO_TK_GENERAL_ERROR; break; } return(status); } /*===========================================================================*\ Function: ProTestFamAddColumn Purpose: To add a column to a table \*===========================================================================*/ int ProTestFamAddColumn( ProFamtable *p_famtable ) { ProFamtableItem item; ProError status; status = ProTestFamSelectItem( p_famtable, &item ); if( status == PRO_TK_NO_ERROR ) { status = ProFamtableItemAdd( p_famtable, &item ); TEST_CALL_REPORT("ProFamtableItemAdd()", "ProTestFamAddColumn( )", status, 0); } return(status); } /*===========================================================================*\ Function: ProTestFamDelColumn Purpose: To delete a column from a table \*===========================================================================*/ int ProTestFamDelColumn( ProFamtable *p_famtable ) { ProFamtableItem item; ProError status; status = ProTestFamSelectItem( p_famtable, &item ); if( status == PRO_TK_NO_ERROR ) { status = ProFamtableItemRemove( p_famtable, &item ); TEST_CALL_REPORT("ProFamtableItemRemove()", "ProTestFamDelColumn( )", status, status != PRO_TK_NO_ERROR); } return(status); } /*===========================================================================*\ Function: ProTestFamtabInstNameCompare Purpose: Compare the fam table instance name with a given string. Used as ProFamtableInstanceAction Return: PRO_TK_E_FOUND - strings are equal, PRO_TK_NO_ERROR-otherwise \*===========================================================================*/ ProError ProTestFamtabInstNameCompare( ProFaminstance *p_inst, ProError status, ProAppData app_data ) { wchar_t *p_wname = (wchar_t*)app_data; if( ProUtilWstrCmp( p_wname, p_inst->name ) == 0 ) return PRO_TK_E_FOUND; else return PRO_TK_NO_ERROR; } /*===========================================================================*\ Function: ProTestFamtabInstFilter Purpose: Filter for ProFamtableInstanceVisit \*===========================================================================*/ ProError ProTestFamtabInstFilter( ProFaminstance *p_inst, ProAppData app_data ) { return PRO_TK_NO_ERROR; } /*====================================================================*\ Function : ProTestFamtabItemSet Purpose : Set the item values of fam table instance \*====================================================================*/ ProError ProTestFamtabItemSet( ProFamtableItem *p_item, ProError status, ProAppData app_data /* In: Instance */ ) { ProFaminstance *p_inst = (ProFaminstance*)app_data; ProParamvalue paramval; ProParamvalueType paramval_type; wchar_t w_buffer[ PRO_NAME_SIZE ]; char name[ PRO_NAME_SIZE ]; char str[ PRO_NAME_SIZE ]; double dbl_value; int int_value; status = ProFaminstanceValueGet( p_inst, p_item, ¶mval ); TEST_CALL_REPORT( "ProFaminstanceValueGet()", "ProTestFamtabItemSet()", status, status != PRO_TK_NO_ERROR); if( status != PRO_TK_NO_ERROR ) return PRO_TK_NO_ERROR; status = ProParamvalueTypeGet( ¶mval, ¶mval_type ); TEST_CALL_REPORT( "ProParamvalueTypeGet()", "ProTestFamtabItemSet()", status, status != PRO_TK_NO_ERROR); ProTKSprintf( str, "Enter %s value [ENTER]: ", ProWstringToString( name, p_item->string ) ); ProUtilMsgPrint( MSG_FILE_FAM, (char *)"TEST %0s", str ); switch( paramval_type ) { case PRO_PARAM_DOUBLE: status = ProMessageDoubleRead( NULL, &dbl_value ); TEST_CALL_REPORT( "ProMessageDoubleRead()", "ProTestFamtabItemSet()", status, status != PRO_TK_NO_ERROR); if( status == PRO_TK_NO_ERROR ) { status = ProParamvalueSet( ¶mval, (void*)&dbl_value, PRO_PARAM_DOUBLE ); TEST_CALL_REPORT( "ProParamvalueSet()", "ProTestFamtabItemSet()", status, status != PRO_TK_NO_ERROR); } break; case PRO_PARAM_STRING: status = ProMessageStringRead( PRO_NAME_SIZE, w_buffer ); TEST_CALL_REPORT( "ProMessageStringRead()", "ProTestFamtabItemSet()", status, status != PRO_TK_NO_ERROR); if( status == PRO_TK_NO_ERROR ) { status = ProParamvalueSet( ¶mval, (void*)w_buffer, PRO_PARAM_STRING ); TEST_CALL_REPORT( "ProParamvalueSet()", "ProTestFamtabItemSet()", status, status != PRO_TK_NO_ERROR); } break; case PRO_PARAM_INTEGER: status = ProMessageIntegerRead( NULL, &int_value ); TEST_CALL_REPORT( "ProMessageIntegerRead()", "ProTestFamtabItemSet()", status, status != PRO_TK_NO_ERROR); if( status == PRO_TK_NO_ERROR ) { status = ProParamvalueSet( ¶mval, (void*)&int_value, PRO_PARAM_INTEGER ); TEST_CALL_REPORT( "ProParamvalueSet()", "ProTestFamtabItemSet()", status, status != PRO_TK_NO_ERROR); } break; case PRO_PARAM_BOOLEAN: case PRO_PARAM_NOTE_ID: case PRO_PARAM_VOID: break; default: break; } status = ProFaminstanceValueSet( p_inst, p_item, ¶mval ); TEST_CALL_REPORT( "ProFaminstanceValueSet()", "ProTestFamtabItemSet()", status, status != PRO_TK_NO_ERROR); return PRO_TK_NO_ERROR; } /*===========================================================================*\ Function: ProTestFamtabItemFilter Purpose: Filter for ProFamtableItemVisit \*===========================================================================*/ ProError ProTestFamtabItemFilter( ProFamtableItem *p_item, ProAppData app_data ) { return PRO_TK_NO_ERROR; } /*===========================================================================*\ Function: ProTestFamAddInst Purpose: Add an instance to a family table \*===========================================================================*/ int ProTestFamAddInst( ProFamtable *p_famtable) { ProError status; ProFaminstance instance; ProName w_name; ProFaminstance *famt_instance; int famt_items_num, i; ProFamtableItem *famt_item; /* Enter the name of new instance */ ProUtilMsgPrint( MSG_FILE_FAM, (char *)"TEST %0s", (char *)"Enter the instance name: " ); status = ProMessageStringRead( PRO_NAME_SIZE - 1, w_name ); TEST_CALL_REPORT( "ProMessageStringRead()", "ProTestFamAddInst()", status, status != PRO_TK_NO_ERROR ); if( status != PRO_TK_NO_ERROR ) return PRO_TK_NO_ERROR; /* See if the name already exists */ status = ProUtilCollectFamtableInstance (p_famtable, &famt_instance); if (status == PRO_TK_NO_ERROR) { status = ProArraySizeGet ((ProArray)famt_instance, &famt_items_num); TEST_CALL_REPORT( "ProArraySizeGet()", "ProTestFamAddInst()", status, status != PRO_TK_NO_ERROR ); for (i = 0; i < famt_items_num; i++) { status = ProTestFamtabInstNameCompare (famt_instance+i, PRO_TK_NO_ERROR, (ProAppData)w_name); } status = ProArrayFree ((ProArray*)&famt_instance); TEST_CALL_REPORT( "ProArrayFree()", "ProTestFamAddInst()", status, status != PRO_TK_NO_ERROR ); } if( status == PRO_TK_E_FOUND ) { ProUtilMsgPrint( MSG_FILE_FAM, (char *)"TEST %0s", (char *)"The instance already exists" ); return PRO_TK_NO_ERROR; } /* Initialize the instance handle */ status = ProFaminstanceInit( w_name, p_famtable, &instance ); TEST_CALL_REPORT( "ProFaminstanceInit()", "ProTestFamAddInst()", status, status != PRO_TK_NO_ERROR ); /* Add the instance to the family table */ status = ProFaminstanceAdd( &instance ); TEST_CALL_REPORT( "ProFaminstanceAdd()", "ProTestFamAddInst()", status, status != PRO_TK_NO_ERROR ); /* Set the instance values */ status = ProUtilCollectFamtableItem (p_famtable, &famt_item); if (status == PRO_TK_NO_ERROR) { status = ProArraySizeGet ((ProArray)famt_item, &famt_items_num); TEST_CALL_REPORT( "ProArraySizeGet()", "ProTestFamAddInst()", status, status != PRO_TK_NO_ERROR ); for (i = 0; i < famt_items_num; i++) { status = ProTestFamtabItemSet (famt_item+i, PRO_TK_NO_ERROR, (ProAppData)&instance); } status = ProArrayFree ((ProArray*)&famt_item); TEST_CALL_REPORT( "ProArrayFree()", "ProTestFamAddInst()", status, status != PRO_TK_NO_ERROR ); } return status; } /*===========================================================================*\ Function: ProTestFamDelInst Purpose: Delete the fam table instance \*===========================================================================*/ int ProTestFamDelInst( ProFamtable *p_famtable ) { ProError status; int n_sels; ProFaminstanceList p_inst_list; status = ProArrayAlloc( 0, sizeof(ProFaminstance), 1, (ProArray*)(&p_inst_list) ); TEST_CALL_REPORT( "ProArrayAlloc()", "ProTestFamDelInst()", status, status != PRO_TK_NO_ERROR ); if( status != PRO_TK_NO_ERROR ) return -1; status = ProFaminstanceSelect( p_famtable, PRO_B_FALSE, &n_sels, &p_inst_list ); TEST_CALL_REPORT( "ProFaminstanceSelect()", "ProTestFamDelInst()", status, status != PRO_TK_NO_ERROR ); if( status != PRO_TK_NO_ERROR || n_sels < 1 ) return -1; /* Bug 540831 */ status = ProFaminstanceErase( &(p_inst_list[0]) ); TEST_CALL_REPORT( "ProFaminstanceErase()", "ProTestFamDelInst()", status, status != PRO_TK_NO_ERROR ); /* Delete the instance from the family table */ status = ProFaminstanceRemove( &(p_inst_list[0]) ); TEST_CALL_REPORT( "ProFaminstanceRemove()", "ProTestFamDelInst()", status, status != PRO_TK_NO_ERROR ); if( status == PRO_TK_E_NOT_FOUND ) { ProUtilMsgPrint( MSG_FILE_FAM, (char *)"TEST %0s", (char *)"The instance does not exist" ); } status = ProArrayFree( (ProArray*)(&p_inst_list) ); TEST_CALL_REPORT( "ProArrayFree()", "ProTestFamDelInst()", status, status != PRO_TK_NO_ERROR ); return(0); } /*===========================================================================*\ Function: ProTestFamShowInst Purpose: Show instance model \*===========================================================================*/ int ProTestFamShowInst( ProFamtable *p_famtable) { ProError status; int n_sels; ProFaminstanceList p_inst_list; ProMdl p_model; status = ProArrayAlloc( 0, sizeof(ProFaminstance), 1, (ProArray*)(&p_inst_list) ); TEST_CALL_REPORT( "ProArrayAlloc()", "ProTestFamShowInst()", status, status != PRO_TK_NO_ERROR ); if( status != PRO_TK_NO_ERROR ) return -1; status = ProFaminstanceSelect( p_famtable, PRO_B_FALSE, &n_sels, &p_inst_list ); TEST_CALL_REPORT( "ProFaminstanceSelect()", "ProTestFamShowInst()", status, status != PRO_TK_NO_ERROR ); if( status != PRO_TK_NO_ERROR || n_sels < 1 ) return -1; /* Create an instance model of the specified instance handle */ status = ProFaminstanceRetrieve( &(p_inst_list[0]), &p_model ); TEST_CALL_REPORT( "ProFaminstanceRetrieve()", "ProTestFamShowInst()", status, status != PRO_TK_NO_ERROR ); if( status == PRO_TK_E_NOT_FOUND ) { ProUtilMsgPrint( MSG_FILE_FAM, (char *)"TEST %0s", (char *)"The instance does not exist" ); } if( status == PRO_TK_NO_ERROR ) { /* Retrieve the handle to the instance model, if it is in session */ /* It's unnecessary lines. Only to test ProFaminstanceMdlGet() */ status = ProFaminstanceMdlGet( &(p_inst_list[0]), &p_model ); TEST_CALL_REPORT( "ProFaminstanceMdlGet()", "ProTestFamShowInst()", status, status != PRO_TK_NO_ERROR ); ProTestModelDisplay( p_model ); } status = ProArrayFree( (ProArray*)(&p_inst_list) ); TEST_CALL_REPORT( "ProArrayFree()", "ProTestFamShowInst()", status, status != PRO_TK_NO_ERROR ); return(0); } /*===========================================================================*\ Function: ProTestFamLockInst Purpose: Lock/unlock instance \*===========================================================================*/ int ProTestFamLockInst( ProFamtable *p_famtable ) { ProError status; int n_sels; ProFaminstanceList p_inst_list; int lock_it; status = ProArrayAlloc( 0, sizeof(ProFaminstance), 1, (ProArray*)(&p_inst_list) ); TEST_CALL_REPORT( "ProArrayAlloc()", "ProTestFamLockInst()", status, status != PRO_TK_NO_ERROR ); if( status != PRO_TK_NO_ERROR ) return -1; status = ProFaminstanceSelect( p_famtable, PRO_B_FALSE, &n_sels, &p_inst_list ); TEST_CALL_REPORT( "ProFaminstanceSelect()", "ProTestFamLockInst()", status, status != PRO_TK_NO_ERROR ); if( status != PRO_TK_NO_ERROR || n_sels < 1 ) return -1; /* Get the lock status */ status = ProFaminstanceCheck( &(p_inst_list[0]), &lock_it ); TEST_CALL_REPORT( "ProFaminstanceCheck()", "ProTestFamLockInst()", status, status != PRO_TK_NO_ERROR ); lock_it = lock_it == PRO_B_TRUE ? PRO_B_FALSE : PRO_B_TRUE; /* Locks or unlocks the specified instance */ status = ProFaminstanceLock( &(p_inst_list[0]), lock_it ); TEST_CALL_REPORT( "ProFaminstanceLock()", "ProTestFamLockInst()", status, status != PRO_TK_NO_ERROR ); if( status == PRO_TK_E_NOT_FOUND ) { ProUtilMsgPrint( MSG_FILE_FAM, (char *)"TEST %0s", (char *)"The instance does not exist" ); } status = ProArrayFree( (ProArray*)(&p_inst_list) ); TEST_CALL_REPORT( "ProArrayFree()", "ProTestFamLockInst()", status, status != PRO_TK_NO_ERROR ); return(0); } /*===========================================================================*\ Function: ProTestFamShowGeneric Purpose: Show the generic model \*===========================================================================*/ int ProTestFamShowGeneric( ProFamtable *p_famtable ) { ProError status; ProMdl p_model; ProMdl p_generic_model; status = ProMdlCurrentGet( &p_model ); TEST_CALL_REPORT( "ProMdlCurrentGet()", "ProTestFamShowGeneric()", status, status != PRO_TK_NO_ERROR ); status = ProFaminstanceGenericGet( p_model, PRO_B_FALSE, &p_generic_model ); TEST_CALL_REPORT( "ProFaminstanceGenericGet()", "ProTestFamShowGeneric()", status, status != PRO_TK_NO_ERROR ); if( status == PRO_TK_E_NOT_FOUND ) { ProUtilMsgPrint( MSG_FILE_FAM, (char *)"TEST %0s", (char *)"The specified model is not an instance" ); return -1; } ProTestModelDisplay( p_generic_model ); return(0); } /*===========================================================================*\ Function : ProTestFamInstRetrieve Purpose : Retrieve an instance of a model from disk \*===========================================================================*/ int ProTestFamInstRetrieve( ProFamtable *p_famtable ) { ProError status; ProFaminstance instance; ProName w_name; ProMdl p_model; int is_lock; /* Enter the name of new instance */ ProUtilMsgPrint( MSG_FILE_FAM, (char *)"TEST %0s", (char *)"Enter the instance name: " ); status = ProMessageStringRead( PRO_NAME_SIZE - 1, w_name ); TEST_CALL_REPORT( "ProMessageStringRead()", "ProTestFamInstRetrieve()", status, status != PRO_TK_NO_ERROR ); if( status != PRO_TK_NO_ERROR ) return PRO_TK_NO_ERROR; status = ProFaminstanceInit( w_name, p_famtable, &instance ); TEST_CALL_REPORT( "ProFaminstanceInit()", "ProTestFamInstRetrieve()", status, status != PRO_TK_NO_ERROR ); status = ProFaminstanceCheck( &instance, &is_lock ); TEST_CALL_REPORT( "ProFaminstanceCheck()", "ProTestFamInstRetrieve()", status, status != PRO_TK_NO_ERROR ); if( status == PRO_TK_E_NOT_FOUND ) { ProUtilMsgPrint( MSG_FILE_FAM, (char *)"TEST %0s", (char *)"The instance does not exist" ); return -1; } status = ProFaminstanceRetrieve( &instance, &p_model ); TEST_CALL_REPORT( "ProFaminstanceRetrieve()", "ProTestFamInstRetrieve()", status, status != PRO_TK_NO_ERROR ); ProTestModelDisplay( p_model ); return 0; } /*===========================================================================*\ Function : ProTestFamtabActions Purpose : Test Edit, Show and Erase of the family table. \*===========================================================================*/ int ProTestFamtabActions( ProFamtable *p_famtable, int action) { ProError status, status2; ProMdl p_model; status = ProFamtableCheck(p_famtable); TEST_CALL_REPORT("ProFamtableCheck()", "ProTestFamtabActions()", status, status != PRO_TK_NO_ERROR && status != PRO_TK_EMPTY ); status2 = ProMdlCurrentGet( &p_model ); TEST_CALL_REPORT( "ProMdlCurrentGet()", "ProTestFamtabActions()", status2, status2 != PRO_TK_NO_ERROR ); status2 = ProSolidFamtableCheck ((ProSolid)p_model); TEST_CALL_REPORT("ProSolidFamtableCheck()", "ProTestFamActions()", status2, status2 != PRO_TK_NO_ERROR && status2 != PRO_TK_EMPTY ); if ( status != PRO_TK_NO_ERROR ) { ProUtilMsgPrint( MSG_FILE_FAM, (char *)"TEST %0s", (char *)"The family table is empty."); return status; } switch(action) { case PRO_TEST_FAM_EDIT: status = ProFamtableEdit(p_famtable); TEST_CALL_REPORT("ProFamtableEdit()", "ProTestFamtabActions()", status, status != PRO_TK_NO_ERROR); break; case PRO_TEST_FAM_SHOW: status = ProFamtableShow(p_famtable); TEST_CALL_REPORT("ProFamtableShow()", "ProTestFamtabActions()", status, status != PRO_TK_NO_ERROR); break; case PRO_TEST_FAM_ERASE: status = ProFamtableErase( p_famtable ); TEST_CALL_REPORT("ProFamtableErase()", "ProTestFamtabActions()", status, status != PRO_TK_NO_ERROR); /* Re-init ProFamtable structure */ status = ProFamtableInit( p_model, p_famtable ); TEST_CALL_REPORT("ProFamtableInit()", "ProTestFamtabActions()", status, status != PRO_TK_NO_ERROR); break; default: ProUtilMsgPrint( MSG_FILE_FAM, (char *)"TEST %0s", (char *)"The error in action."); break; } return (PRO_TK_NO_ERROR); } /*===========================================================================*\ Function : ProTestFamShowFile Purpose : output the family table to a file \*===========================================================================*/ int ProTestFamShowFile( ProFamtable *p_famtable) { ProCharName fname; ProFileName wfname; ProTestAppData data; ProError status; ProFamtableItem *famt_items; int famt_items_num, i; ProError ProTestVisitFamTabItems(ProFamtableItem *item, ProError status, ProAppData app_data); data.p_famtab = p_famtable; data.fp = ProUtilGenFilePtr(p_famtable->owner, (char*)OUT_FILE_EXT, fname, (char*)"w+"); if(data.fp == NULL) { ProUtilMsgPrint( MSG_FILE_FAM, "TEST %0s", "Cannot open file for write"); return(PRO_TK_GENERAL_ERROR); } ProTKFprintf(data.fp, "\t\t\tFamily Table Filename : %s\n", fname); status = ProFamtableCheck(p_famtable); TEST_CALL_REPORT("ProFamtableCheck()", "ProTestFamShowFile()", status, status != PRO_TK_NO_ERROR); if ( status == PRO_TK_E_NOT_FOUND ) ProTKFprintf(data.fp, "\tThe family table is empty.\n"); else if ( status == PRO_TK_NO_ERROR ) { status = ProUtilCollectFamtableItem (p_famtable, &famt_items); if (status == PRO_TK_NO_ERROR) { status = ProArraySizeGet ((ProArray)famt_items, &famt_items_num); TEST_CALL_REPORT( "ProArraySizeGet()", "ProTestFamShowFile()", status, status != PRO_TK_NO_ERROR ); for (i = 0; i < famt_items_num; i++) { status = ProTestVisitFamTabItems (famt_items+i, PRO_TK_NO_ERROR, (ProAppData)&data); } status = ProArrayFree ((ProArray*)&famt_items); TEST_CALL_REPORT( "ProArrayFree()", "ProTestFamShowFile()", status, status != PRO_TK_NO_ERROR ); } } fclose(data.fp); ProStringToWstring(wfname, fname); status = ProInfoWindowDisplay(wfname, NULL, NULL); TEST_CALL_REPORT("ProInfoWindowDisplay()", "ProTestFamShowFile( )", status, status != PRO_TK_NO_ERROR); return (PRO_TK_NO_ERROR); } /*====================================================================*\ Function : ProTestFamTabItemFilter Purpose : Test filter item visit function. \*====================================================================*/ ProError ProTestFamTabItemFilter( ProFamtableItem *item, ProAppData app_data) { return(PRO_TK_NO_ERROR); } /*====================================================================*\ Function : ProTestVisitFamTabItems Purpose : Visit Family Table items. \*====================================================================*/ ProError ProTestVisitFamTabItems( ProFamtableItem *item, ProError status, ProAppData app_data) { ProTestAppData *data = (ProTestAppData *)app_data; ProModelitem model_item; char name[PRO_NAME_SIZE]; char str1[PRO_NAME_SIZE]; ProParameter parameter; ProFaminstance *famt_instance; int famt_instance_num, i; ProError ProTestVisitFamTabInst(ProFaminstance *instance, ProError status, ProAppData app_data); data->p_item = item; ProWstringToString(name, item->string); ProTKFprintf(data->fp, "\n\tFamily Table Item (Column) : %s\n", name); switch( item->type ) { case PRO_FAM_TYPE_UNUSED: ProTKSprintf(str1, "%s", "PRO_FAM_TYPE_UNUSED"); break; case PRO_FAM_USER_PARAM: ProTKSprintf(str1, "%s", "PRO_FAM_USER_PARAM"); break; case PRO_FAM_DIMENSION: ProTKSprintf(str1, "%s", "PRO_FAM_DIMENSION"); break; case PRO_FAM_IPAR_NOTE: ProTKSprintf(str1, "%s", "PRO_FAM_IPAR_NOTE"); break; case PRO_FAM_FEATURE: ProTKSprintf(str1, "%s", "PRO_FAM_FEATURE"); break; case PRO_FAM_ASMCOMP: ProTKSprintf(str1, "%s", "PRO_FAM_ASMCOMP"); break; case PRO_FAM_UDF: ProTKSprintf(str1, "%s", "PRO_FAM_UDF"); break; case PRO_FAM_ASMCOMP_MODEL: ProTKSprintf(str1, "%s", "PRO_FAM_ASMCOMP_MODEL"); break; case PRO_FAM_GTOL: ProTKSprintf(str1, "%s", "PRO_FAM_GTOL"); break; case PRO_FAM_TOL_PLUS: ProTKSprintf(str1, "%s", "PRO_FAM_TOL_PLUS"); break; case PRO_FAM_TOL_MINUS: ProTKSprintf(str1, "%s", "PRO_FAM_TOL_MINUS"); break; case PRO_FAM_TOL_PLUSMINUS: ProTKSprintf(str1, "%s", "PRO_FAM_TOL_PLUSMINUS"); break; case PRO_FAM_SYSTEM_PARAM: ProTKSprintf(str1, "%s", "PRO_FAM_SYSTEM_PARAM"); break; case PRO_FAM_EXTERNAL_REFERENCE: ProTKSprintf(str1, "%s", "PRO_FAM_EXTERNAL_REFERENCE"); break; case PRO_FAM_MERGE_PART_REF: ProTKSprintf(str1, "%s", "PRO_FAM_MERGE_PART_REF"); break; default: ProTKSprintf(str1, "%s", "No Type."); break; } ProTKFprintf(data->fp, "\tFamilytabItem Type : %s\n", str1); if( item->type == PRO_FAM_USER_PARAM || item->type == PRO_FAM_SYSTEM_PARAM ) { status = ProFamtableItemToParameter( item, ¶meter ); TEST_CALL_REPORT( "ProFamtableItemToParameter()", "ProTestVisitFamTabItems( )", status, status != PRO_TK_NO_ERROR ); ProWstringToString( str1, parameter.id ); ProTKFprintf( data->fp, "\tParameter Type : %d\n", parameter.type ); ProTKFprintf( data->fp, "\tParameter Id : %s\n", str1 ); } else { status = ProFamtableItemToModelitem(item, &model_item); TEST_CALL_REPORT( "ProFamtableItemToModelitem()", "ProTestVisitFamTabItems( )", status, status != PRO_TK_NO_ERROR); ProTKFprintf(data->fp, "\tModelitem Type : %d\n", model_item.type); ProTKFprintf(data->fp, "\tModelitem Id : %d\n", model_item.id); } status = ProUtilCollectFamtableInstance (data->p_famtab, &famt_instance); if (status == PRO_TK_NO_ERROR) { status = ProArraySizeGet ((ProArray)famt_instance, &famt_instance_num); TEST_CALL_REPORT( "ProArraySizeGet()", "ProTestVisitFamTabItems()", status, status != PRO_TK_NO_ERROR ); for (i = 0; i < famt_instance_num; i++) { status = ProTestVisitFamTabInst (famt_instance+i, PRO_TK_NO_ERROR, (ProAppData)app_data); } status = ProArrayFree ((ProArray*)&famt_instance); TEST_CALL_REPORT( "ProArrayFree()", "ProTestVisitFamTabItems()", status, status != PRO_TK_NO_ERROR ); } return(PRO_TK_NO_ERROR); } /*====================================================================*\ Function : ProTestFamTabInstFilter Purpose : Test filter instance visit function. \*====================================================================*/ ProError ProTestFamTabInstFilter( ProFaminstance *instance, ProAppData app_data) { return(PRO_TK_NO_ERROR); } /*====================================================================*\ Function : ProTestVisitFamTabInst Purpose : Visit Family Table instances. \*====================================================================*/ ProError ProTestVisitFamTabInst( ProFaminstance *instance, ProError status, ProAppData app_data) { ProTestAppData *data = (ProTestAppData *)app_data; ProParamvalue paramval; char name[PRO_NAME_SIZE], str1[PRO_NAME_SIZE]; ProWstringToString(name, instance->name); ProTKFprintf(data->fp, "\t\tInstance : %s; \t", name); /* bug - 536940 4/23/97 */ status = ProFaminstanceValueGet(instance, data->p_item, ¶mval); TEST_CALL_REPORT("ProFaminstanceValueGet()", "ProTestVisitFamTabInst( )", status, status != PRO_TK_NO_ERROR); switch( paramval.type ) { case PRO_PARAM_DOUBLE: ProTKSprintf(str1, "%lf", paramval.value.d_val); break; case PRO_PARAM_STRING: ProWstringToString( str1, paramval.value.s_val ); break; case PRO_PARAM_INTEGER: ProTKSprintf(str1, "%d", paramval.value.i_val); break; case PRO_PARAM_BOOLEAN: ProTKSprintf(str1, "%d", paramval.value.l_val); break; case PRO_PARAM_NOTE_ID: ProTKSprintf(str1, "%s", "PRO_PARAM_NOTE_ID"); break; case PRO_PARAM_VOID: ProTKSprintf(str1, "%s", "PRO_PARAM_VOID"); break; default: ProTKSprintf(str1, "%s", "No Value."); break; } ProTKFprintf(data->fp, "\t\tValue : %s\n", str1); ProTKFprintf(data->fp, "\t\t\n"); return(PRO_TK_NO_ERROR); } ProError ProTestModelDisplay( ProMdl p_model ) { ProError status = PRO_TK_NO_ERROR; #ifndef PT_PRODUCTS_BUILD ProMdlName w_model_name; ProType model_type; int win_id; status = ProMdlMdlnameGet( p_model, w_model_name ); TEST_CALL_REPORT( "ProMdlMdlnameGet()", "ProTestModelDisplay()", status, status != PRO_TK_NO_ERROR ); status = ProMdlTypeGet( p_model, (ProMdlType*)&model_type ); TEST_CALL_REPORT( "ProMdlTypeGet()", "ProTestModelDisplay()", status, status != PRO_TK_NO_ERROR ); status = ProObjectwindowMdlnameCreate( w_model_name, model_type, &win_id ); TEST_CALL_REPORT( "ProObjectwindowMdlnameCreate()", "ProTestModelDisplay()", status, status != PRO_TK_NO_ERROR ); status = ProSolidDisplay( (ProSolid)p_model ); TEST_CALL_REPORT( "ProSolidDisplay()", "ProTestModelDisplay()", status, status != PRO_TK_NO_ERROR && status != PRO_TK_E_FOUND ); #endif return status; }